在C 中禁止類繼承

2021-06-15 21:43:43 字數 520 閱讀 8831

下面的**將會禁止繼承:

class a;

class lock

};class a :  virtual public lock

a(int t)

{}現在,如果你嘗試從類a派生其它類將會得到類似下面這樣的編譯錯誤。

class b : public a

{}; // lock::lock' : cannot access private member declared in class 'lock'

這是因為派生類都需要呼叫虛基類的建構函式,因此從a派生的b需要呼叫虛基類的建構函式(也就是lock

的建構函式),而lock的建構函式是私有的,類b又不是lock的友元,所以這將會產生乙個編譯錯誤。

如果我們移除類a派生時的virtual關鍵字,程式將會成功編譯。這是因為在非虛擬繼承中,任何類都可以

呼叫直接父類中的建構函式。因此,在非虛擬繼承中,b將呼叫它的直接父類a的建構函式而a將呼叫它的直接父

類lock的建構函式,這都是合法的。 

在C 中禁止類繼承

下面的 將會禁止繼承 class a class lock class a virtual public lock a int t 現在,如果你嘗試從類a派生其它類將會得到類似下面這樣的編譯錯誤。class b public a lock lock cannot access private mem...

C 中禁止類被派生的方法

在我的那篇 c 中虛析構函式的作用 中我說明了為什麼作為基類的類的析構函式必須是虛函式,同時也指出 為了避免產生虛函式表,如果類不是基類的話,析構函式就不需要宣告為虛函式。但是,我們不能預料使用者的行為,你不敢肯定使用者是否會從你的類去派生自己的類。如果使用者以乙個基類指標去刪除乙個派生類的物件,就...

C 中禁止類被派生的方法

我的那篇 c 中虛析構函式的作用 中我說明了為什麼作為基類的類的析構函式必須是虛函式,同時也指出 為了避免產生虛函式表,如果類不是基類的話,析構函式就不需要宣告為虛函式。但是,我們不能預料使用者的行為,你不敢肯定使用者是否會從你的類去派生自己的類。如果使用者以乙個基類指標去刪除乙個派生類的物件,就會...