如何在 if 语句中使用dynamic_cast
How to use dynamic_cast in if statement
所以我有一个简单的任务要做。从一个基类派生了 3 个类。它们非常简单,将在下面提供。 我需要做的是创建一个名为PolymorphicAnimal
的新类,它的行为与从Animal
基类派生的任何其他animal
一样。 确切地说,他们需要做的就是在调用方法SoundOff
后显示正确的文本。我猜我需要在这里使用dynamic_cast
。我的问题是,使用dynamic_cast
作为if
语句的正确语法是什么,所有派生类是否也需要至少有一个虚拟方法?
#include "stdafx.h"
#include <iostream>
#include <string>
class Animal {
public:
virtual std::string SoundOff() = 0;
};
class Dog : public Animal {
std::string SoundOff() override { return "Woof"; }
};
class Cat : public Animal {
std::string SoundOff() override { return "Meow"; }
};
class Cow : public Animal {
std::string SoundOff() override { return "Muu"; }
};
class PolymorphicAnimal : public Animal {
std::string sound;
public:
PolymorphicAnimal(const Animal &a) {
if(std::dynamic_cast<Cat*>(a))
}
};
if(std::dynamic_cast...
行生成编译器错误:
syntax error '<', illegal token on the right side of ::
和expected an identifier
在C++中,您可以在if
的条件中声明一个变量,这是一个强大的功能,您可以在此处利用。所以
if (auto kitty = dynamic_cast<const Cat*>(&a)){
// kitty is not nullptr
}
笔记:
dynamic_cast
是一个关键字;请删除std::
- 我用了一个指针
dynamic_cast
.引用替代项是不切实际的,因为通常不能期望将引用类型隐式转换为bool
类型,如果引用强制转换失败,则会引发异常。
dynamic_cast
几乎总是一个黑客。
为什么不向Animal
添加另一个虚拟方法,然后让Dog
、Cat
和Cow
以通常的方式覆盖它? 还是你不控制这些类?
目前还不清楚PolymorphicAnimal应该做什么。 不知何故,你需要告诉PolymorphicAnimal如何表现,对吧?所以,我猜它更像是一个工厂,而不是一个派生类。
像这样:
class PolymorphicAnimal : Animal
{
private:
Animal *animal;
public:
PolymorphicAnimal(int type)
{
if (type == Type_Cat) // Type_Cat is an enum for example
{
animal = new Cat();
}
// ...add other types here
}
std::string SoundOff()
{
return animal->SoundOff();
}
}
通常,在正常程序中,您不需要执行if(某事dynamic_cast某事(。
虽然虚拟方法或访问者可能更合适,但您可以使用以下内容:
PolymorphicAnimal(const Animal &a) {
if (const auto* cat = dynamic_cast<const Cat*>(&a)) {
// use cat
} else if (const auto* dog = dynamic_cast<const Dog*>(&a)) {
// use dog
} // ...
}
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理