2

这里的第二个演员给出了一个错误说

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

这是什么意思??

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

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

4

1 回答 1

5

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

...dynamic_cast<T>(v)

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

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

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

struct B { };
struct D : B { };
void foo(D* dp) {
    B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
}
于 2012-05-09T21:52:41.780 回答