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

2024-01-04

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

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(使用前将#替换为@)

动态转换不适用于非多态基类? 的相关文章

随机推荐