建構函式不能是虛函式

時間 2021-05-10 19:44:15

1樓:ylq

建構函式不是不能是虛函式,而是完全沒意義。

c++在編譯期間就能確定你要建立的物件的具體型別,而這個具體型別包含了什麼,繼承了什麼在編譯期間也是明確的,所以要構造什麼也都是明確的,根本沒必要存在虛建構函式。

虛函式的存在是因為編譯期間沒法確定具體呼叫物件,才會有虛函式,虛函式表這麼個東西。

2樓:雞賊軒主

題主混淆了兩個概念:「delegating constructor」和「virtual function」。

題主的問題描述都是在說delegating constructor,那當然可以用,只不過不要叫它虛函式。

class A // delegating construction:在乙個建構函式裡呼叫同乙個類的另乙個建構函式

A(int x): x_(x) {} // 帶乙個引數的建構函式

private:

int x_ = 0;

};2. 虛函式的乙個必要條件是,該函式是基類和派生類中具有同樣簽名(返回值*、函式名、引數列表)的函式。又因為建構函式名和自己的類名保持一致,所以基類和派生類的建構函式名保證不一樣,根本不符合虛函式最起碼的要求,by-design就不能是虛函式。

*這個有特例,不過與主題無關。當基類的虛函式返回某個類型別B的指標或引用時,派生類中對應的虛函式可以將返回值型別宣告為B的派生類對應的指標或引用。

3樓:onlynice

我的理解是建構函式本身涉及到vptr的設定,那麼vptr指向虛表裡面儲存虛函式位址,那麼建構函式是虛函式和建構函式要設定vptr是矛盾的。我的理解,不知道對不對。

4樓:

建構函式是虛函式有意義嗎。。?new的時候就會按型別建立物件了,基類型別建立基類物件,子類型別建立子類物件,之後才有基類指標指向子類物件需要呼叫虛函式的情況,除非你對基類指標指向的子類物件顯式呼叫一遍建構函式,但這完全可以用類似reinit之類的函式實現。

c 靜態成員函式為什麼不能為虛函式?

Elvis Wang 其實我覺得這個問題沒有回答的必要,屬於語言概念層面的東西。class A 首先你要搞清楚什麼是普通成員函式。成員函式是類例項相關的,不同的例項物件呼叫成員函式結果一般都不同。比如,上面的fun1是成員函式,你進行呼叫 A a1 new A A a2 new A a1 fun1 ...

為什麼不能在析構函式中呼叫虛函式?

CHAN.K 析構函式中呼叫虛函式不會呈現出多型!因為,當你呼叫某個繼承層次中的析構函式的時候,編譯系統會預設從該層開始,往後的派生類已經都被析構了,所以 也就不能出現多型的情況了.當然,這麼寫編譯器也不會報錯 唐沂 Effective C 條款9講建構函式中不要呼叫虛函式已經很清楚了,析構函式與其...

C 虛函式和C 虛函式的區別?

c 不了解。但是關於c 的說法,這樣是不對的。題主你其實糾結的不是語言,而是an implementation of c 意思是,之所以會有上面的結果,是因為你的編譯器的實現。在c 標準裡面,對於virtual 的具體實現沒有做任何要求。而virtual method table只是大多數編譯器的實...