为什么只有多态类允许基于派生的动态转换

时间:2012-01-13 11:43:33

标签: c++ dynamic-cast polymorphism downcast

  

可能重复:
  FAQ: Why does dynamic_cast only work if a class has at least 1 virtual method?

我已经读过,在C ++中,执行动态转换一组类的层次结构,只有在类是多态的情况下才允许转换,例如当基类具有虚函数时,等等这种限制的原因是什么?使用纯虚函数代替基类中的普通虚函数更安全吗?

谢谢!

3 个答案:

答案 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一起使用。它是纯粹还是不纯仅影响是否可以实例化基类。