条款39:明智而审慎地使用 private 继承
Use private inheritance judiciously.
private 继承的规则:
编译器不会自动将一个 derived class 对象转换为一个 base class 对象;
private base class 继承而来的所有成员,在 derived class 中都会变成 private 属性;
private 继承意味着 implemented-in-terms-of,只有实现部分被继承,接口部分应略去。如果让 class D 以 private 形式继承 class B,那么意味着采用 class B 内的某些特性,而不是因为 B 对象和 D 对象存在任何观念上的关系。
对比于复合中的 implemented-in-terms-of 实现,应该尽可能地使用复合,必要时才使用 private 继承。这个必要时刻主要是牵扯了 protected 成员或 virtual 函数的时候。
举个例子,有个 Widget 类,现在想知道 Widget 成员函数调用的频率,而我们手上有一个用于计数的类 Timer。以 private 复用代码的形式为:
而以复合方式的优点在于:
Widget 可以拥有 derived class,但同时阻止 derived class 重新定义 onTick;
Widget 编译依存性降至最低,WidgetTimer 移出 Widget 之外而 Widget 内含指针指向一个 WidgetTimer,Widget 可以只带着一个简单的 WidgetTimer 声明式;
Last updated
Was this helpful?