从technical point of view
到底是什么意思,我知道这意味着我的derived class
始终可以转换为base class
,就是这样吗?我阅读了一些 Material ,但没有提及技术方面,只是哲学!提前致谢
最佳答案
这意味着我的派生类始终可以转换为基类
实际上,这意味着更好。 int
始终可以转换为float
,但这并不意味着int"is"浮点数。这只是意味着可以从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/