在《C++箴言:确保公开继承模拟“is-a”》一文中论述了 C++ 将 public inheritance(公有继承)视为一个 is-a 关系。当给定一个 hierarchy(继承体系),其中有一个 class Student 从一个 class Person 公有继承,当为一个函数调用的成功而有必要时,需要将 Students 隐式转型为 Persons,它通过向编译器展示来做到这一点。用 private inheritance(私有继承)代替 public inheritance(公有继承)把这个例子的一部分重做一下是值得的: _:l<4u!
;AgXl%Q
class Person { ... }; )IZ~!N|-w
class Student: private Person { ... }; // inheritance is now private 6b#J!:?
UjQi9ELoJ
void eat(const Person& p); // anyone can eat f5QJj<@
#FV `*G
void study(const Student& s); // only students study %GDs/9
Gnmxp%&}P|
Person p; // p is a Person Yim` 3>#t
Student s; // s is a Student eVy\)dCsU
?HaUT(\j
eat(p); // fine, p is a Person
+0O^!o
:n<<hR0d
eat(s); // error! a Student isn't a Person [+v}V ,jb
D`uOBEX
很明显,private inheritance(私有继承)不意味着 is-a。那么它意味着什么呢? Mkadl<
&