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