virtual應用於建構函式和析構函式的用途

2021-07-12 01:35:01 字數 778 閱讀 2674

virtual的應用實現了多型,那麼對於類中的兩個特殊的函式,建構函式和析構函式能不能用虛函式?

(1)建構函式不能設計為虛函式

如果類中定義了虛函式,則會生成虛表,那麼為了呼叫這個虛函式就要通過虛表來呼叫。可是,建構函式比較特殊,建構函式是在物件完全構造之前執行,那麼就導致物件還沒有例項化,那就還沒有記憶體空間,沒有記憶體空間肯定就找不到虛表,找不到虛表就不能呼叫虛函式,所以建構函式不能是虛函式。

(2)用來做基類的析構函式設計為虛函式

為什麼這麼說呢?不做基類的析構函式也可以設計為基類,但是沒有意義,而且這樣做編譯器會給類中加虛函式表裡面存放虛函式指標,這樣增加的類空間的大小,所以只有用來做基類的析構函式設計為虛函式較合理。

為什麼基類的析構函式設計為虛函式,看如下的例子:

#include

#include

using namespace std;

class a;

virtual  ~a()

編譯結果如下:

b::func1()

b::~b()

a::~a()

可以看出用基類指標p指向乙個生成的派生類b的物件,在delete p釋放基類指標時,會同時釋放派生類b所占用的記憶體空間。這正是我們想要的。

但是如果將程式中的基類a的析構函式改為非虛函式,則編譯結果為:

b::func1()

a::~a()

可以看出並沒有釋放基類指標指向的空間的資源,二僅僅是釋放了指標,這樣會造成記憶體洩露。

C explicit關鍵字應用於建構函式

c 程式語言可以被看做是c語言的乙個公升級版本,其中有很多應用方式與c語言相似,但同時又比c語言功能更加強大,應用方式更加靈活。在這裡我們就可以先從c explicit關鍵字的應用方式來具體分析一下這一語言的應用方法。c explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯...

C explicit關鍵字應用於建構函式

c 程式語言可以被看做是c語言的乙個公升級版本,其中有很多應用方式與c語言相似,但同時又比c語言功能更加強大,應用方式更加靈活。在這裡我們就可以先從c explicit關鍵字的應用方式來具體分析一下這一語言的應用方法。c explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯...

python應用於網路 python應用於網路通訊

專案需要用到採用python實現維護測試工具,測試物件是linux裝置,需要在pc端採用python獲取linux裝置相關資訊 一 採用udp獲取普通資訊 udpserver socket af inet,sock dgram udpserver.bind ip,port data,client a...