NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
## 条款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 复用代码的形式为: ```cpp class Timer { public: explicit Timer(int tickFrequency); virtual void onTick() const; }; class Widget: private Timer { private: virtual void onTick() const; }; ``` 而以复合方式的优点在于: * Widget 可以拥有 derived class,但同时阻止 derived class 重新定义 onTick; * Widget 编译依存性降至最低,WidgetTimer 移出 Widget 之外而 Widget 内含指针指向一个 WidgetTimer,Widget 可以只带着一个简单的 WidgetTimer 声明式; ```cpp class Widget { private: class WidgetTimer: public Timer { public: virtual void onTick() const; }; WidgetTimer timer; }; ```