有的時候我們寫了一個類,但是不希望本類被別人繼承,如果別人被繼承的情況下能夠在編譯期就能在繼承的類中報錯。
如何實現該功能?主要有幾個知識點,掌握之後很容易實現該功能。
知識點:(1) 友元不能被繼承
(2) 虛基類的虛函數表由子類負責構造
(3) 子類的構造需要調用父類的構造函數
方法1:
把不想讓別人繼承的類(A)的構造函數聲明爲私有的。
缺點:這種方法不能夠滿足在編譯期報錯的要求且報了連接錯誤不容易查找
方法2:
(1) 聲明不想被別人繼承的類(CCanNotInherit)的構造函數爲私有的
class CAssistant
{
friend class CCanNotInherit;
private:
CAssistant() {}
~CAssistant() {}
};
class CCanNotInherit : virtual public CAssistant
{
public:
CCanNotInherit() {}
~CCanNotInherit() {}
int bb;
};
void main( void )
{
CCanNotInherit aa;
aa.bb=0;
}//
虛繼承, 在虛派生中,由最低層派生類的構造函數初始化虛基類,CAssistant的構造函數是私有的,因爲CCanNotInherit虛繼承CAssistant,所以CCanNotInherit負責初始化基類,因爲CCanNotInherit是基類的友元類,所以可以訪問基類的私有構造函數,但如果把CCanNotInherit作爲父類,因爲友元不能繼承,所以初始化基類的時候會出錯,目的達到!