gpt4 book ai didi

c++ - dynamic_cast 不适用于非多态类型的原因

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:16 25 4
gpt4 key购买 nike

对于类 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 ,但它只是说“因为这就是它在内部实现的方式”——至少在我看来是这样)。设计 dynamic_cast 的人可能还有其他一些原因 - 那些是什么?

最佳答案

因为如果没有在对象中存储一些类型信息供运行时使用,就无法实现dynamic_cast。该语言只有两个特性需要有关对象类型的运行时信息:虚函数和dynamic_cast

如果可以使用 dynamic_cast 向下转换非多态类型,编译器将不得不在每个 类类型中存储运行时类型信息。这将直接违背 C++ 的“只为你使用的东西付费”的哲学,并且它会完全破坏它与 C 和许多外部接口(interface)、硬件等的兼容性。不会有标准布局类类型,基本上。或者,也没有您可以完全控制其布局的类类型。

关于c++ - dynamic_cast 不适用于非多态类型的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35729540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com