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

Kun*_*nal 2 c++ casting

这里第二次演员表示错误

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
Run Code Online (Sandbox Code Playgroud)

这意味着什么?

如果我使基类具有多态性,为什么会这样?

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

Oli*_*rth 6

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

... dynamic_cast<T>(v)

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

实际上,因为可以生成动态下转换(即从base到派生)所需的运行时类型信息(RTTI)以及vtbl/vptr机制,如果没有多态成员函数则不需要.

另一方面,向上转换(即派生到基础)不需要RTTI(没有运行时决定).引用标准的同一部分:

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