c 虛函式(二)

2021-05-23 05:13:54 字數 988 閱讀 2991

二. 虛函式的語法

虛函式的標誌是「virtual」關鍵字。

2.1 使用virtual關鍵字

考慮下面的類層次:

class a

;class b: public a

;class c: public b // 從b繼承,不是從a繼承!

;這種情況下,b::foo()是虛函式,c::foo()也同樣是虛函式。因此,可以說,基類宣告的虛函式,在派生類中也是虛函式,即使不再使用virtual關鍵字。

2.2 純虛函式

如下宣告表示乙個函式為純虛函式:

class a

;乙個函式宣告為純虛後,純虛函式的意思是:我是乙個抽象類!不要把我例項化!純虛函式用來規範派生類的行為,實際上就是所謂的「介面」。它告訴使用者,我的派生類都會有這個函式。

2.3 虛析構函式

析構函式也可以是虛的,甚至是純虛的。例如:

class a

;當乙個類打算被用作其它類的基類時,它的析構函式必須是虛的。考慮下面的例子:

class a

~a() // 非虛析構函式

private:

char * ptra_;

};class b: public a

~b()

private:

char * ptrb_;

};void foo()

在這個例子中,程式也許不會象你想象的那樣執行,在執行delete a的時候,實際上只有a::~a()被呼叫了,而b類的析構函式並沒有被呼叫!這是否有點兒可怕?

如果將上面a::~a()改為virtual,就可以保證b::~b()也在delete a的時候被呼叫了。因此基類的析構函式都必須是virtual的。

純虛的析構函式並沒有什麼作用,是虛的就夠了。通常只有在希望將乙個類變成抽象類(不能例項化的類),而這個類又沒有合適的函式可以被純虛化的時候,可以使用純虛的析構函式來達到目的。

2.4 虛建構函式?

建構函式不能是虛的。

C 虛函式及虛函式表解析 二

c 中的成員和函式,有靜態和非靜態。1 非靜態資料成員 放在每乙個物件體內,作為物件專有的資料成員。2 靜態資料成員 被提取出來放在程式的靜態資料區內,為該類所有物件共享,因此只存在乙份。引申下,乙個類模板中的靜態資料成員例項化成模板類之後有幾份?思考下。3 靜態和非靜態成員函式 最終都被提取出來放...

C 虛函式 純虛函式

1 基本概念 虛函式是在基類中使用關鍵字virtual宣告的函式。在派生類中重新定義基類中定義的虛函式時,會告訴編譯器不要靜態鏈結到該函式。我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態鏈結,或後期繫結。您可能想要在基類中定義虛函式,以便在派生類中重新定義該函...

C 虛函式 純虛函式

1.析構函式是否應為虛函式問題?2.成員函式的虛函式問題?3.析構函式是否可以為純虛函式問題?說明 僅在使用父類指標指向子類物件時有區別 當析構函式非虛函式時,使用父類指標指向子類物件,在析構時將不會呼叫子類析構函式 當析構函式是虛函式時,使用分類指標指向子類物件,在析構時會呼叫子類析構函式,且呼叫...