c ++中'isa'的技术方面
what0ѭ究竟是什么意思,我明白这意味着我的
derived class
总能转换为base class
,就是这样?我读了一些材料,没有任何参考技术方面,只有哲学!提前致谢
没有找到相关结果
已邀请:
2 个回复
瞥同忙接
总是可以转换为
,但这并不意味着int“是一个”浮动。它只是意味着可以从int构造一个float。同样,您可以拥有转换的用户定义类,但没有其他关系。 通过继承,对派生类的指针或引用始终可以转换为指针或对基类[*]的引用。也就是说,派生类的对象可以代替基类的对象。它实际上就是其中之一。如果一个人可以代替脑外科医生,那么他们就是脑外科医生。 一个正式的定义,如果“是一个”是芭芭拉利斯科夫的替代原则。诚然,这仍然是哲学,但它是非常合理的哲学,它直接与你编写程序的方式有关。 在C ++中使用继承时,你必须保持直接的另一件事是运行时多态(使用
函数实现)和静态多态(实际上根本不需要继承)之间的区别。对于非虚函数调用,所调用函数的版本始终是编译器被告知对象具有的类(静态类型)中定义的版本。如果它在派生类中重载,则实际上可能无法正常工作。对于虚拟调用,调用的版本是对象实际所在的类中定义的版本(动态类型)。决定你所瞄准的两种“是”中的哪一种是至关重要的。 [*]并且可以通过指针有效地访问对象,即。你总是可以用
强制指针类型,但这不是我的意思。并且有一些繁琐的细节 - 如果基类是模糊的,那么你不能一次性转换指针,但你可以使用几个明确的转换显式地做。如果基类不可访问,那么您可以转换它,但只能使用C样式转换,而不是隐式。 C风格的演员表现得像
,忽略了无障碍,而不像
。所以你得到一个工作指针,但希望也有一种强烈的感觉,你做的事情非常错误;-)
购藏盗码韦