这在 C++ 中无法编译:
class A
{
};
class B : public A
{
};
...
A *a = new B();
B *b = dynamic_cast<B*>(a);
最佳答案
因为 dynamic_cast 只能向下转换多态类型,所以标准这么说。
您可以通过向基类添加 virtual 析构函数来使您的类具有多态性。事实上,你可能应该无论如何(见脚注)。否则,如果您尝试通过 A 指针删除 B 对象,您将调用 Undefined Behavior .
class A
{
public:
virtual ~A() {};
};
瞧!
关于在多态类型中需要虚拟析构函数的“规则”有一些异常(exception)。
一个这样的异常(exception)是使用 boost::shared_ptr 正如 Steve Jessop 在下面的评论中指出的那样。有关何时需要虚拟析构函数的更多信息,请阅读 Herb Sutter文章。
关于c++ - 常见问题解答 : Why does dynamic_cast only work if a class has at least 1 virtual method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4227328/