在《C++箴言:确保公开继承模拟“is-a”》一文中论述了 C++ 将 public inheritance(公有继承)视为一个 is-a 关系。当给定一个 hierarchy(继承体系),其中有一个 class Student 从一个 class Person 公有继承,当为一个函数调用的成功而有必要时,需要将 Students 隐式转型为 Persons,它通过向编译器展示来做到这一点。用 private inheritance(私有继承)代替 public inheritance(公有继承)把这个例子的一部分重做一下是值得的: [>_(q|A6+
R?&S]?H
class Person { ... }; zLh ~x
class Student: private Person { ... }; // inheritance is now private ki+9Ln;
3?5
~KxOE(
void eat(const Person& p); // anyone can eat @Qc['V)
$yFur[97C
void study(const Student& s); // only students study <
m9O0
.cZ&~ N
Person p; // p is a Person dNJK[1e6
Student s; // s is a Student hU=J^Gi0
x(=kh%\;
eat(p); // fine, p is a Person fnmZJJ,Q
Bnxzy
n
eat(s); // error! a Student isn't a Person 9C4l@jrF
"]N QTUb;
很明显,private inheritance(私有继承)不意味着 is-a。那么它意味着什么呢? J<`RlDI
O5=ggG
“喂!”你说:“在我们得到它的含义之前,我们先看看它的行为。private inheritance(私有继承)有怎样的行为呢?”好吧,支配 private inheritance(私有继承)的第一个规则你只能从动作中看到:与 public inheritance(公有继承)对照,如果 classes(类)之间的 inheritance relationship(继承关系)是 private(私有)的,编译器通常不会将一个 derived class object(派生类对象)(诸如 Student)转型为一个 base class object(基类对象)(诸如 Person)。这就是为什么为 object(对象)s 调用 eat 会失败。第二个规则是从一个 private base class(私有基类)继承的 members(成员)会成为 derived class(派生类)的 private members(私有成员),即使它们在 base class(基类)中是 protected(保护)的或 public(公有)的。 dIpt&nH&$
q]r!5&Z