C 中禁止類被派生的方法

2021-06-21 13:13:58 字數 1156 閱讀 2372

我的那篇「c++中虛析構函式的作用」中我說明了為什麼作為基類的類的析構函式必須是虛函式,同時也指出:為了避免產生虛函式表,如果類不是基類的話,析構函式就不需要宣告為虛函式。

但是,我們不能預料使用者的行為,你不敢肯定使用者是否會從你的類去派生自己的類。如果使用者以乙個基類指標去刪除乙個派生類的物件,就會發生派生類的

析構函式不被呼叫

的情況。這樣做的危險性我想大家都知道。當然,你可以在類的說明文件中,甚至是在類的標頭檔案中,說明你寫的類不能作為基類。可是,誰又能保證,使用者會仔細閱讀這些說明呢?

所以,我們最好的方法就是禁止類的派生。如果使用者從你的類去派生自己的類,那麼在編譯階段他就會知道這樣做是錯的,從而避免可能發生在執行階段的析構函式不被呼叫的危險。而禁止類派生的方法就是把建構函式宣告為私有的。例如下面的類就不能被派生:

class

clxnotbase;

如果使用者從類clxnotbase派生了乙個類,那麼在編譯階段他就會得到乙個不能訪問私有成員函式的錯誤資訊。

當然,你肯定會說:如果把類的建構函式宣告為私有的,那麼我們就無法構造這個類的物件,那我要這個類還有什麼用呢?

是的,你說的很對。不過,我們可以用很簡單的方法來解決這個問題。下面是修改過的類clxnotbase:

class

clxnotbase

;clxnotbase 

*clxnotbase::newlxnotbase()

clxnotbase 

*clxnotbase::newlxnotbase(

const

clxnotbase

&rhs) 

使用者在要使用類clxnotbase的時候,就可以呼叫偽建構函式newlxnotbase來生成物件。當然,每個偽建構函式都呼叫了new,這就意味著使用者必須在使用完類clxnotbase的物件後都必須呼叫delete。但是,釋放不用的資源是每個c++程式設計師的基本素質,這個我們就不用強調了。而且,現在有了智慧型指標auto_ptr,可以自動刪除所指的物件,如果使用者知道用智慧型指標的話,那就更好了。下面是乙個例子:

auto_ptr

<

clxnotbase

>

p(clxnotbase::newlxnotbase());

在這種情況下,就不用考慮delete物件的問題。在物件離開作用域的時候,智慧型指標會自動刪除其所指的物件。

C 中禁止類被派生的方法

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

C 中的基類與派生類

繼承方式 說明 public 基類的public和protected的成員被派生類繼承後,保持原來的狀態 private 基類的public和protected的成員被派生類繼承後,變成派生類的private成員 protected 基類的public和protected的成員被派生類繼承後,變成派...

C 基類 派生類 方法隱藏 方法重寫

最近重新學習c 中基礎,找到了隱藏基類方法和重寫基類方法的一點區別,二者都是在派生類中定義了與基類中相同的方法,相同點派生類物件將執行各自的派生類中的方法,不同點,在向上轉型後,重寫基類方法的呼叫的是派生類的方法,而隱藏基類呼叫的是基類的方法,具體實驗 class program 如果乙個方法被子類...