我的那篇「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 如果乙個方法被子類...