C 學習筆記 虛析構函式與純虛析構函式

2022-03-19 15:59:34 字數 2220 閱讀 2027

開始學c++了,所以又重拾以前學習過的相關概念…

析構函式是當乙個物件的生命週期結束時,會自動執行析構函式。

析構函式的定義:

private:

int a;

int b;

int c;

};#endif

虛析構函式與純虛析構函式的定義(假定類名為a):

private:

int a;

int b;

int c;

};#endif

};#endif

其中定義了純虛函式後,類a就成為了「抽象類」,它是不能有例項物件的。否則會報錯:

「a」: 不能例項化抽象類

由於下列成員:

「a::~a(void)」: 是抽象的

乙個類維護乙個虛函式相關的表--vtable(__vfptr指向它),函式宣告前面包含關鍵字「virtual」的函式,就會建立乙個指向該函式的指標(函式指標)被存入vtable中。

虛函式表的作用是用來實現多型,但同時也帶來了執行效率和額外記憶體空間的增加。

再來看虛析構函式,它所存在的意義:基類的指標指向派生類物件,用基類的指標刪除派生類物件。

using

namespace std;

class a

輸出:

a…

b…~a…

派生類的析構函式未被呼叫,為什麼呢?

派生類繼承自基類,那麼基類就只會存在於派生類中,直到派生類呼叫析構函式後。

假定:基類的析構函式呼叫比派生類要早,會造成的一種情況就是類成員不存在了,而類本身卻還在,但是類存在的情況下,類成員應該還存在。所以這就矛盾了,所以派生類的析構函式會先被呼叫,基類的析構函式再被呼叫。

修改一下**:

using

namespace std;

class a

輸出:

a…

b…~b…

~a…

僅僅只是在基類的析構函式前面加了乙個「virtual」,使它成為「虛析構函式」了,這就是「虛析構函式」存在的意義 :)

析構函式的作用並不是刪除物件,而是撤銷物件占用記憶體之前完成的一些清理工作…

總結:如果某個類不包含虛函式,那一般是表示它將不作為乙個基類來使用。當乙個類不準備作為基類使用時,就不要定義虛析構函式了,因為它會增加乙個虛函式表,使得物件的體積翻倍,還有可能降低其可移值性。

所以基本的一條是:無故的宣告虛析構函式和永遠不去宣告一樣是錯誤的。

當且僅當類裡包含至少乙個虛函式的時候,才去宣告虛析構函式。

抽象類是準備被用做基類的,基類必須要有乙個虛析構函式,純虛函式會產生抽象類,所以在想要成為抽象類的類裡宣告乙個純虛析構函式。

定義乙個函式為虛函式,不代表該函式未被實現,只是為了來實現多型。

定義乙個函式為純虛函式,才表示函式未被實現 ,定義它是為了實現乙個介面,起乙個規範作用。繼承抽象類的派生類要實現這個函式…

看下面的**,如何輸出:

#ifndef __a_h__

#define __a_h__

class a

;#endif

#include

"a.h"

#include

using

namespace std;

a::a(void)

a::a(int a, int b)

;#endif

#include

"b.h"

#include

using

namespace std;

b::b(void)

b::~b(void)

void b::f()

{cout<<"b::f()"

{cout<<"b:ff()"

<

main函式的定義:

b b;

a * a = &b;

a->f();

a->ff();

return 0;

輸出什麼?

b::f()

a::ff()

//定義指向基類物件的指標a,當呼叫f()方法時,因為f為虛函式,所以呼叫了派生類的f(),輸出b::f();

參考:詳解c++中的純虛函式(虛函式區別)&多型性以及例項應用

c++析構函式、建構函式、虛函式關係

c++中虛函式工作原理和(虛)繼承類的記憶體占用大小計算

C 學習筆記 虛析構函式與純虛析構函式

開始學c 了,所以又重拾以前學習過的相關概念 析構函式是當乙個物件的生命週期結束時,會自動執行析構函式。析構函式的定義 define a h class a endif 虛析構函式與純虛析構函式的定義 假定類名為a define a h class a endif define a h class ...

C 學習筆記 虛析構函式與純虛析構函式

析構函式是當乙個物件的生命週期結束時,會自動執行析構函式。析構函式的定義 private int a int b int c endif 虛析構函式與純虛析構函式的定義 假定類名為a private int a int b int c endif endif 其中定義了純虛函式後,類a就成為了 抽象...

C 學習筆記 虛析構函式與純虛析構函式

開始學c 了,所以又重拾以前學習過的相關概念 析構函式是當乙個物件的生命週期結束時,會自動執行析構函式。析構函式的定義 private int a int b int c endif 虛析構函式與純虛析構函式的定義 假定類名為a private int a int b int c endif end...