C 之建構函式為什麼不能為虛函式

2021-07-13 14:45:48 字數 1366 閱讀 9772

針對虛函式在說虛函式表的時候已經說過了c++之虛函式表,虛函式的執行是根據虛函式表,而虛函式表是在物件生成後,釋放前才存在的,建構函式就是來生成物件的,物件還沒有生成,就把建構函式宣告為了虛函式,放到了虛函式表中,可是虛函式表又不存在,這就矛盾了,故當然不可以把建構函式宣告為虛函式,如果這麼做了,編譯器直接報錯。

舉幾個例子實實在在的展示一下虛函式表的生命週期:

public:

father()

~father() {}

virtual

void func()

};class son : public father

~son() {}

virtual

void func()

};int main()

輸出結果:

這裡father的建構函式中的this指標是father類的物件,呼叫func()函式並沒有實現多型,正式因為此時son類物件還沒有建立,此時的虛函式表不存在。

再舉個例子:

#include

using

namespace

std;

class father

~father()

virtual

void func()

};class son : public father

~son() {}

virtual

void func()

};int main()

輸出結果:

father的析構函式有個this指標,仍然指向father的物件,呼叫了func()函式,仍然沒有實現多型,因為father析構的時候,子類son已經析構掉了,此時虛函式表也已經不存在了,自然也無法實現多型。

再來看乙個:

#include

using

namespace

std;

class father

~father()

virtual

void func()

void foo()

};class son : public father

~son() {}

virtual

void func()

};int main()

輸出結果:

這個時候就完美的實現了多型,此時son物件已經生成,也沒有被析構,虛函式表是存在的,這就為實現多型奠定了堅實的基礎。

從上面三個例子就能看出虛函式表的生命週期是完全依賴於物件的宣告週期的,物件存在虛函式表存在,物件不存在虛函式表也不存在。

為什麼建構函式不能為虛函式

1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函式。2,從使用角度 虛函式主要用...

為什麼建構函式不能為虛函式

1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函式。2,從使用角度 虛函式主要用...

為什麼建構函式不能為虛函式

1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函式。2,從使用角度 虛函式主要用...