許多C++程序員從來沒用過私有繼承來設計他的類。的確,如果是本該用私有繼承的地方卻用了公有繼承,對程序的功能的實現並無影響。但這種誤用是一種錯位的描述,會引起閱讀者的誤解,甚至會引起類的使用者的茫然。當我們在寫一個類的聲明的時候,實際上是在做一個意圖的設計。而設計者需要的恰恰是精確描述。
私有繼承的弦外之音要解釋私有繼承,我們先來看看共有繼承,好做個比較。
公有繼承,本質上就是 is-a 的關系。如,描述吉普車是一種車,那麼可以進行以下的設計:
class Car { }; class Jeep : public Car { }
class Engine { public: void Run(); }; class Car : private Engine { public: void Drive() { // let engine go! Run(); } };在關系描述上,等同於組合,如:
class Car { ... private: Engine m_engine; }
私有繼承帶來過多的程序開銷,而組合卻是短平快,所以一般來說,設計者想描述Has-A的關系時,組合方式是首選的。
但以下兩種方式則必須使用私有繼承:
A類需要使用B類的protected成員函數來實現自己的功能時A類需要重寫B類的虛函數時