C 陷阱 建構函式中的多型

2021-12-29 22:32:46 字數 715 閱讀 9844

c++中主要是通過給函式加上virtual關鍵字來實現多型。多型可用於改變乙個介面的實現,也算是一種嵌入應用層**到底層的實現手段。就算你用不到c++那些複雜的技術,多型肯定會被用到。

但加上virtual不一定能保證多型成功:

#include

class base

virtual ~base()

virtual void init()

virtual void release()

};class derived : public base

virtual void release()

};int main()

當在建構函式,包括析構函式中呼叫virtual函式時,預想中的多型是無法完成的,以上**輸出結果為:

base::init

base::release

從語言設計角度來看,我個人是不接受這種行為的。我覺得對一門語言而言,幾乎所有特性都應該是一致的,不應該或盡量少地出現這種「例外「。如果我構造乙個物件,讓它以不同的方式被構造,這和改變它的某個行為有什麼區別?(從這句話來看,似乎還真有區別)

當然,從語言實現來看,這樣的執行結果又似乎是必然的。因為,基類的構造是早於派生類的(作為其一部分),只有當構造完派生類後,其用於支援多型的虛表才會被正確構造。也就是說,在基類中呼叫虛函式時,既然虛表都為正確構造,自然呼叫的不會是派生類的虛函式了。析構函式按照析構的順序來看,也會面臨同樣的情況。

Java中建構函式的陷阱

abstract class father public static void main string as class child extends father public static void main string as 請問此段 是否能編譯通過,並輸出值?答案是不能編譯通過,因為父建構...

C 建構函式 繼承與多型

public person string name public person string name,int age this name public person string name public programmer string name,int age,string language ...

C 中構造函式呼叫建構函式

include include using namespace std struct cls cls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體 非靜態資料成員是未初始化的 2 ...