gpt4 book ai didi

c++ - C++ 中 'isa' 的技术方面

转载 作者:行者123 更新时间:2023-11-30 00:59:43 25 4
gpt4 key购买 nike

技术角度来看到底是什么意思,我理解是说我的derived class总是可以转换成base class,就这?我读了一些 Material ,没有任何技术方面的引用,只有哲学!提前致谢

最佳答案

这意味着我的派生类总是可以转换为基类

实际上它的意思比那个更好。 int 始终可以转换为 float,但这并不意味着 int"is"float。这只是意味着可以从 int 构造 float。同样,您可以拥有可转换但没有其他关系的用户定义类。

通过继承,派生类的指针或引用总是可以转换为基类的指针或引用[*]。也就是说,派生类的对象可以代替基类的对象。它实际上是其中之一。如果一个人可以代替脑外科医生,那么他们就是脑外科医生。

如果"is",一个正式定义是芭芭拉·利斯科夫 (Barbara Liskov) 的 substitution principle .诚然,这仍然是哲学,但它是非常健全的哲学,它直接关系到你如何编写程序。

在 C++ 中使用继承时,您必须保持直截了当的另一件事是运行时多态性(使用 virtual 函数实现)和静态多态性(实际上根本不需要继承)之间的区别。对于非虚函数调用,被调用函数的版本始终是编译器被告知对象具有的类(静态类型)中定义的版本。如果它在派生类中重载,这实际上可能无法正常工作。对于虚拟调用,调用的版本是对象实际所属的类(动态类型)中定义的版本。确定您的目标是两种"is"中的哪一种。

[*] 并且对象可以通过指针有效访问,也就是说。您始终可以使用 reinterpret_cast 强制指针类型,但这不是我在这里的意思。还有一些繁琐的细节——如果基类是不明确的,那么你不能一次性转换指针,但你可以使用几个明确的强制转换来明确地做到这一点。如果基类不可访问,那么您可以转换它,但只能使用 C 风格的转换,而不是隐式转换。 C 风格的转换就像一个忽略可访问性的 static_cast,而不像一个 reinterpret_class。所以你得到了一个工作指针,但希望也有一种强烈的感觉,你做错了什么;-)

关于c++ - C++ 中 'isa' 的技术方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3849724/

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