动态强制转换不适用于非多态基类

dynamic cast not working for non polymorphic base class?

本文关键字:多态 基类 适用于 不适用 转换 动态      更新时间:2023-10-16

这里第二个强制转换给出一个错误说

cast.cc:35:35: error: cannot dynamic_cast ‘base’ (of type ‘class CBase*’) to type ‘class CDerived*’ (source type is not polymorphic)

    CBase * base = new CDerived; 
    CBase* pb;
    CDerived * der = new CDerived; 
    CDerived* pd;
    pb = dynamic_cast<CBase*>(der);     // ok: derived-to-base
    pd = dynamic_cast<CDerived*>(base);  // wrong: base-to-derived

这是什么意思??

如果我使基类多态,为什么这会起作用?

有人可以让我知道这背后的基本概念。

因为标准是这样说的(参见C++标准中的[expr.dynamic.cast]部分(:

dynamic_cast<T>(v)

v应是指向多态类型的指针或左值

在实践中,因为使动态向下转换(即从基到派生(成为可能所需的运行时类型信息 (RTTI( 是与 vtbl/vptr 机制一起生成的,如果没有多态成员函数,则不需要该机制。

另一方面,向上转换(即派生到 base(不需要 RTTI(无需做出运行时决策(。 引用标准的同一部分:

struct B { };
struct D : B { };
void foo(D* dp) {
    B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
}