有课B
和派生类D
:
class B {
int b;
};
class D : public B {
int d;
};
D* d = new D();
B* b = dynamic_cast<B*>(d);
上面的代码可以正常工作——这是一个简单的向上转换。我们确信无论怎样b
指向的是B
其中的类(子)对象。
然而,
B* b = new D();
D* d = dynamic_cast<D*>(b);
即使这样也不会编译b
指向一个有效的D
实例——因为基类不是多态的。因此,只需添加一个空虚拟方法即可解决问题。
重要的问题是为什么 C++ 要求源类型是多态的?我找到的唯一解释是this https://stackoverflow.com/a/4644856/5539357,但它只是说“因为这就是它内部的实现方式”——至少在我看来)。设计过的人dynamic_cast
可能还有其他一些原因——那些是什么?
因为没有办法实现dynamic_cast
没有存储在对象中供运行时使用的某些类型信息。该语言只有两个功能需要对象类型的运行时信息:虚拟函数和dynamic_cast
.
如果可以使用的话dynamic_cast
要向下转换非多态类型,编译器必须将运行时类型信息存储在every类类型。这将直接违背 C++ 的“只为你使用的东西付费”的哲学,并且它会utterly破坏了它与 C 和许多外部接口、硬件等的兼容性。基本上不会有标准布局类类型。或者,没有可以完全控制其布局的类类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)