这里第二个演员给出了一个错误说
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
这是什么意思??
如果我使基类具有多态性,为什么这会起作用?
有人可以让我知道这背后的基本概念吗?
因为标准是这么说的(参见 C++ 标准中的 [expr.dynamic.cast] 部分):
... dynamic_cast<T>(v)
... v
应是指向多态类型的指针或多态类型的左值
在实践中,由于运行时类型信息 (RTTI) http://en.wikipedia.org/wiki/RTTI使动态向下转换(即从基础到派生)成为可能所需的与vtbl/vptr机制 http://en.wikipedia.org/wiki/VTBL,如果没有多态成员函数,则不需要。
另一方面,向上转换(即派生到基础)不需要 RTTI(无需做出运行时决策)。引用标准的同一部分:
struct B { };
struct D : B { };
void foo(D* dp) {
B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)