1

究竟是什么意思technical point of view,我明白这意味着我derived class总是可以转换为base class,就是这样?我读了一些材料,没有任何技术方面的参考,只有哲学!提前致谢

4

2 回答 2

4

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

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

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

如果“是一个”,一个正式的定义是芭芭拉·利斯科夫的替代原则。诚然,这仍然是哲学,但它是非常合理的哲学,它与您编写程序的方式直接相关。

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

[*] and the object be validly accessible through the pointer, that is. You can always coerce pointer types with reinterpret_cast, but that's not what I mean here. And there are some fiddly details - if the base class is ambiguous then you can't convert the pointer in one go, but you can do it explicitly using several unambiguous casts. If the base class is not accessible then you can convert it, but only with a C-style cast, not implicitly. The C-style cast acts like a static_cast which ignores accessibility, not like a reinterpret_class. So you get a working pointer, but hopefully also a strong sense that you're doing something very wrong ;-)

于 2010-10-03T12:55:13.327 回答
2

派生类只能在给定点 R 转换为可访问且明确的基类。除了 C++ 标准本身之外,没有任何引用和其他地方。

$10.2 是一个很好的参考:派生类本身可以作为受访问控制的基类;见 11.2。指向派生类的指针可以隐式转换为指向可访问的明确基类的指针(4.10)。派生类类型的左值可以绑定到对可访问的明确基类 (8.5.3) 的引用。——尾注]

然后再次

$10.3 - “base-specifier-list 指定派生类类型的对象中包含的基类子对象的类型。[..] 这里,Derived2 类的对象将具有 Derived 类的子对象,而 Derived 类的子对象又将具有Base.[...] 类的子对象

在OOAD原则方面:

我个人会推荐Robert Martin 的文章,以便更好地掌握这一点,尤其是 OCP 原则。我无法超越作者解释这些传奇 OOAD 指南的清晰性和权威性

另请查看@Steves 帖子中解释的 LSP

于 2010-10-03T12:44:02.733 回答