我在 C++ 中读过,在一组类的层次结构中执行动态转换,只有在类是多态的情况下才允许转换,例如当基类具有虚函数时等。什么是这种限制的原因是什么?在基类中使用纯虚函数代替普通虚函数是否更“安全”?
谢谢你!
我在 C++ 中读过,在一组类的层次结构中执行动态转换,只有在类是多态的情况下才允许转换,例如当基类具有虚函数时等。什么是这种限制的原因是什么?在基类中使用纯虚函数代替普通虚函数是否更“安全”?
谢谢你!
这种限制的原因是什么?
dynamic_cast
仅当对象是目标类型的实例时才应该成功。非多态类不包含任何类型信息,因此无法判断是否是这种情况;因此,演员阵容无法成功。
在基类中使用纯虚函数代替普通虚函数是否更“安全”?
就多态性而言,两者都可以。如果基类至少有一个虚函数,那么它是多态的,因此可以与dynamic_cast
. 纯与否只影响基类能否实例化。
执行dynamic_cast
时会在运行时执行类型检查,并且std::bad_cast
在强制类型转换非法时抛出异常或返回空指针。允许这样做的机制称为RTTI。
如果类不是多态的,则无法执行该类型检查,因为在运行时没有存储类型信息。
这是标准引起的限制。
在主要实现中,dynamic_cast
通过比较vfptr
两个类的虚函数表指针来工作。
这是确定类在运行时是否相关的一种方法。dynamic_cast
此外,在非多态类上做 a 真的没有意义。static_cast
为此。
dynamic_cast
我的猜测是,如果您尝试在非多态类上使用,那么您做错了。如果您发布一些代码,我们可以提供帮助。