Chapter 6. Inheritance(继承)和 Object-Oriented Design(面向对象设计)
Object-oriented programming (OOP) 已经流行了差不多 20 年,所以,你很可能对 inheritance(继承),derivation(派生)和 virtual functions(虚拟函数)等概念有一些经验。即使你一直只用 C 来编程,你也不会全然躲过 OOP 的喧嚣。
尽管如此,C++ 的 OOP 和你习惯的东西可能有一点不同。inheritance 可以有 single 或 multiple 之分,而每一个 inheritance 关系可以是 public,protected 或 private。每一个关系也可以是 virtual 或 non-virtual。然后,还有 member function 的选项。Virtual?Non-virtual?Pure virtual?以及与其它语言特性的交互作用。default parameter values(缺省参数值)和 virtual function 如何互相影响?inheritance 如何影响 C++ 的 name lookup rules(名字查找规则)?以及有哪些关于设计的选择?如果一个 class 的行为需要变化,virtual function 是最好的方法吗?
本章将依次给出全部解答。此外,我将解释 C++ 中不同特性的真正意味——也就是说当你使用一个特定的结构,你实际表达了什么。例如,public inheritance 意味着 "is-a",而如果你试图让它意味着其它什么东西,你就会碰到麻烦。同样,一个 virtual function 意味着“interface must be inherited(接口必须被继承)”,而一个 non-virtual function 则意味着“both interface and implementation must be inherited(接口和实现都必须被继承)”。无视这些含义之间的区别就会造成 C++ 编程中相当多的烦恼。
如果你理解了 C++ 各种特性的含义,你就会发现你对 OOP 的观点发生了变化。它不再是区分不同的语言特性的练习,而是成为决定关于你的软件系统你需要描述什么的内容。而且一旦你知道要描述什么,把它转换成 C++ 就不那么费力了。
本章包含以下内容:
Item 32: Make sure public inheritance models "is-a"Item 33: Avoid hiding inherited namesItem 34: Differentiate between inheritance of interface and inheritance of implementationItem 35: Consider alternatives to virtual functionsItem 36: Never redefine an inherited non-virtual functionItem 37: Never redefine a function's inherited default parameter valueItem 38: Model "has-a" or "is-implemented-in-terms-of" through compositionItem 39: Use private inheritance judiciouslyItem 40: Use multiple inheritance judiciously