关于c ++:为什么仅对多态类允许基数到动态转换

Why Base-to-Derived Dynamic Casting is Only Allowed for Polymorphic Classes

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
FAQ: Why does dynamic_cast only work if a class has at least 1 virtual method?

我已经读过,在C ++中,对一组类的层次结构进行动态强制转换,仅在类是多态的情况下(例如,当基类具有虚函数时)才允许进行强制转换。 出现此限制的原因? 用纯虚函数代替基类中的普通虚函数是否更"安全"?

谢谢!


What is the reason for this limitation?

仅当对象是目标类型的实例时,dynamic_cast应该成功。
非多态类不包含任何类型信息,因此无法判断是否是这种情况。因此,转换无法成功。

Is it more 'safe' to have a pure virtual function in place of the normal virtual function in the base class?

就多态性而言,任何一种都很好。如果基类至少具有一个虚函数,则它是多态的,因此可以与dynamic_cast一起使用。是否纯净会影响是否可以实例化基类。


这是标准引起的限制。

在主要实现中,dynamic_cast通过比较两个类的vfptr(虚拟函数表指针)来工作。

这是确定类在运行时是否相关的一种方法。此外,对非多态类进行dynamic_cast并没有任何意义。有static_cast

我的猜测是,如果您尝试在非多态类上使用dynamic_cast,则您做错了。如果您发布一些代码,我们可以为您提供帮助。


当执行dynamic_cast时,会在运行时执行类型检查,并且在强制转换非法时会抛出std::bad_cast异常或返回空指针。
允许执行此操作的机制称为RTTI。

如果类不是多态的,则无法执行该类型检查,因为在运行时不会存储任何类型信息。