一、問題**
大家是否有在子類或基類建構函式中呼叫虛函式的情況呢?語法是否支援?執**況如何呢?為什麼呢?
二、問題驗證
這個問題的最好答案是親自寫個demo除錯下看看結果如何,下面是demo**(vs2019):
1客戶端呼叫**class
base
7virtual
void
func()
10};
1112
class d : public
base
1819
void func() override
22 };
1輸出結構如下:intmain()
2
子類構造函式呼叫虛函式呼叫的是子類重寫的,基類構造函式呼叫的是基類的虛函式。可以回答問題中的前兩個疑問,語法支援,執**況如上;但是並沒有呼叫子類重新的虛函式呢?繼續分析。
三、原因分析
回答這個問題,我們可以直接使用vs2019的偵錯程式即可。我們需要在基類和子類的建構函式中分別打上斷點,如下:
我們知道構造子類前需要先構造基類,在進入基類建構函式實現體前,虛函式表是空的:
通過上面詳細的除錯步驟和物件記憶體虛表資訊即可知道為什麼了吧!
構造函式呼叫虛函式
在建構函式中呼叫虛成員函式,雖然這是個不很常用的技術,但研究一下可以加深對虛函式機制及物件構造過程的理解。這個問題也和一般直觀上的認識有所差異。先看看下面的兩個類定義。struct c180 virtual foo struct c190 public c180 virtual foo 父類中有乙個...
構造函式呼叫虛函式
參考stroustrup的回答吧 在建構函式中呼叫虛成員函式,雖然這是個不很常用的技術,但研究一下可以加深對虛函式機制及物件構造過程的理解。這個問題也和一般直觀上的認識有所差異。先看看下面的兩個類定義。struct c180 virtual foo struct c190 public c180 v...
C 建構函式中呼叫虛函式
我們知道 c 中的多型使得可以根據物件的真實型別 動態型別 呼叫不同的虛函式。這種呼叫都是物件已經構建完成的情況。那如果在建構函式中呼叫虛函式,會怎麼樣呢?有這麼一段 class a virtual void func void test public int m ival class b publ...