动态强制转换不适用于非多态基类
dynamic cast not working for non polymorphic base class?
这里第二个强制转换给出一个错误说
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( 是与 vtbl/vptr 机制一起生成的,如果没有多态成员函数,则不需要该机制。
另一方面,向上转换(即派生到 base(不需要 RTTI(无需做出运行时决策(。 引用标准的同一部分:
struct B { }; struct D : B { }; void foo(D* dp) { B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp; }
相关文章:
- 一个Q_PROPERTY可以泛化为多个基类吗?
- C++ 多态模板类,模板类型对象的实例化
- 非虚拟基的多态成员类
- 如何访问"std::variant"的任何子级的"多态"基类?
- 多态unique_ptr类成员
- 多个基类可以具有相同的虚拟方法吗?
- 如何在代码块 IDE 上修复此警告,警告:按值 [-Wcatch-value=] 捕获多态类型"类 std::d omain_error"
- 流运算符和多态基类列表
- 如何查找多态基类向量中包含的对象的类型?
- 使用对象切片可靠地从多个基类之一中复制
- 增强序列化多态性类
- 是否可以将多态性类存储在共享内存中
- 有没有办法破坏然后移动构造一个多态基类
- 动态强制转换不适用于非多态基类
- 非多态派生类的基类
- 如何通过多态基类接口使用模板化的子类
- 使用多态基类(包含虚函数)访问数组元素时的类型
- 从多态基指针调用基类方法很慢
- 非多态基类中的析构函数
- 如何从指向多态基类的指针复制/创建派生类实例