这里第二个演员表示错误
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
这是什么意思??
如果我使基类具有多态性,为什么会这样?
有人可以告诉我这背后的基本概念。
答案 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; }