这里第二个 Actor 给出了一个错误,说
cast.cc:35:35:错误:无法将“base”(类型为“class CBase*”)动态转换为类型“class CDerived*”(源类型不是多态的)
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
shall be a pointer to or an lvalue of a polymorphic type
在实践中,因为run-time type information (RTTI)使动态向下转换(即从基础到派生)成为可能所需的与 vtbl/vptr mechanism 一起生成,如果没有多态成员函数,则不需要。
另一方面,向上转换(即派生到基础)不需要 RTTI(无需做出运行时决策)。引用标准的同一部分:
struct B { }; struct D : B { }; void foo(D* dp) { B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp; }
关于c++ - 动态转换不适用于非多态基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524598/