開始學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…僅僅只是在基類的析構函式前面加了乙個「virtual」,使它成為「虛析構函式」了,這就是「虛析構函式」存在的意義 :)b…~b…
~a…
析構函式的作用並不是刪除物件,而是撤銷物件占用記憶體之前完成的一些清理工作…
總結:如果某個類不包含虛函式,那一般是表示它將不作為乙個基類來使用。當乙個類不準備作為基類使用時,就不要定義虛析構函式了,因為它會增加乙個虛函式表,使得物件的體積翻倍,還有可能降低其可移值性。
所以基本的一條是:無故的宣告虛析構函式和永遠不去宣告一樣是錯誤的。
當且僅當類裡包含至少乙個虛函式的時候,才去宣告虛析構函式。
抽象類是準備被用做基類的,基類必須要有乙個虛析構函式,純虛函式會產生抽象類,所以在想要成為抽象類的類裡宣告乙個純虛析構函式。
定義乙個函式為虛函式,不代表該函式未被實現,只是為了來實現多型。
定義乙個函式為純虛函式,才表示函式未被實現 ,定義它是為了實現乙個介面,起乙個規範作用。繼承抽象類的派生類要實現這個函式…
看下面的**,如何輸出:
#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...