用c++編寫一個不能被繼承的類(但是可以在類外部定義該類的對象)

        據我們知道,我們只要把類的構造函數和析構函數定義爲private類型,那麼就不能夠在外部建立給類的對象,也就不能以給類爲基類進行繼承,因爲如果繼承,建立對象的時候將要調用基類的構造函數,但是因爲爲private,所以派生類調用基類構造函數的時候,將會連接失敗,這樣達到不能被繼承的任務,但是缺憾是我們不能夠在類外部定義該類的對象。那麼應該怎麼解決呢?????

下面給出代碼

template<class T>class base
{
 friend T;//聲明友類
private:
 base(){}
   ~base(){}
};
class derived:public virtual base<derived>
{
public:
 derived(){}
   ~derived(){}
};

用上面的方法,我們所定義的類derived類可以達到不能被繼承,但是能夠在類外部定義對象的目的,這是爲什麼呢?????

首先我們可以看到derived雷虛擬繼承base類,在模板展開的時候derived類被聲明爲base類的友類,因此可以訪問base中的private部分,所以也就可以調用base中的被定義爲private的構造函數和析構函數,所以定義derived類型的對象沒有任何問題。

現在我們假設有一個類要繼承derived,形如:

class  derived1:public derived

{

 

}

derived1類是不能夠被實例化的,這又是爲什麼呢?????

我們在c++對象模型中知道,構造順序是,虛擬基類-----基類------虛擬指針--------初始化列表中的-------構造函數內部的語句

所以我們就可以知道先會derived1調用虛擬基類base的構造函數,但是對於derived1來說,base的構造函數是不能訪問的,因爲base的構造函數被定義爲private,並且derived1不是base的友類,所以在用derived1構造對象的時候,連接錯誤,也就說明derived是不能夠被繼承的。

經過上面分析我們就達到了設計目的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章