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

时间:2012-05-09 21:51:06

标签: 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

这是什么意思??

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

有人可以告诉我这背后的基本概念。

1 个答案:

答案 0 :(得分:6)

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

  

... dynamic_cast<T>(v)

     

... v应该是指向多态类型

的左值或左值的指针

在实践中,因为run-time type information (RTTI)生成动态下转换(即从基础到派生)所需的vtbl/vptr mechanism与{{3}}一起生成,如果没有多态成员则不需要{{3}}功能

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

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