c 物件模型 虛擬析構函式

2021-09-02 22:28:13 字數 1314 閱讀 3014

看《inside the c++ object model》第二章,彙總一下一些知識點

( **:

作為通常原則,如果乙個類定義了虛函式,那麼它的析構函式就應該定義成虛函式。因為定義了虛函式則意味著這個類會被繼承,並且會通過基類的指標指向子類,從而得到多型。因此,基類的析構函式是否為虛函式將決定子類的物件是否被析構。

很多時候只能獲得基類的指標,但是並不知道它實際上是哪乙個類,這時候刪除基類指標的時候,析構函式就很有用了,如以下**:

#include

using namespace std;

struct a

};

struct b: public a

};

int main()

如果a的析構函式不是virtual,那麼輸出的就是~a();

如果a的析構函式是virtual,那麼刪除p的時候,實際上是呼叫b的析構函式,因此會首先呼叫b的析構函式,然後再呼叫a的析構函式,輸出的結果是:

~b();

~a();

類如果會被派生,一般都會採用析構函式,不是防止記憶體洩露,而是為了正確的析構。如果是個封閉類,那麼就不要定義virtual,因此虛函式的代價比較大。

不用virtual的幾種情況:

1.作為非公共基類。僅作為private base class不需要使用虛擬析構函式。

2.不作為介面使用的基類、

3.如果你可以保證這個類不被public繼承(private/protected繼承的話,在非friend函式/類中就無法用基類指標指向派生類了) 

4.如果它的所有派生類(包括派生類的派生類)的析構函式都是trivial的(這裡的trivial指的是在程式設計師的層次什麼事也不做) 

5. 如果不需要用基類的指標指向派生類的物件

在這五種情況下,不把析構函式宣告為virtual都是可以的,何況效率會高一些——但前提是你得保證前提的成立——不過這些保證常常是很難100%。誰能保證別人在派生你的類的時候,析構函式是trivial的,或者別人不用你提供的基類的指標指向派生類物件?這些常常是很難得到保證的。  

宣告基類的析構函式為virtual並非總是為了防止memory   leak   另外這也只是作為一般的原則(基類中有虛函式則把其析構函式宣告為virtual)。如果你的析構函式什麼事也不作,從效果上來說,不宣告為virtual也無妨

C 虛擬析構函式

c primer 如果所寫的類要充當基類,那麼,這個類的析構函式就必須宣告為虛函式,否則可能造成記憶體洩漏。造成記憶體洩漏的例子 有如下兩個類,類pet是基類,類dog繼承了類pet class pet class dog public pet dog dog const char p m name...

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...

《物件導向程式設計 C 》析構函式

建立類的物件時,會自動呼叫某個合適的建構函式,同樣,當物件被摧毀時,也會自動呼叫乙個析構函式。析構函式的名稱與類的名稱是完全相同的,只是在前面加了個波浪號 作為字首,它不會返回任何值,也不能帶有任何引數。析構函式有助於在跳出程式 比如關閉檔案 釋放記憶體等 前釋放資源。物件的摧毀出現在以下兩種情況 ...