C 建構函式中呼叫虛函式

2021-07-23 18:49:34 字數 973 閱讀 9750

談談關於建構函式中呼叫虛函式的情況,僅討論單繼承,不考慮虛擬繼承和多重繼承。

測試平台:vs2013 + win7x64

乙個例子:

#include

#include

class base

public:

virtual void func()

}; class deri : public base

public:

virtual void func()

}; int main(int argc, char** argv)

輸出:base::func

deri::func

首先討論下物件d的構造情況。

1 先構造基類部分,呼叫基類base的建構函式,這個時候,派生類部分還沒有產生,這時候虛表應該是繫結基類的,自然呼叫的是base::func()

2 再構造派生類部分,這個時候,虛表發生變化,繫結在派生類上,呼叫deri::func()

雖然,在派生類中有過載func這個函式,但是,在構造基類部分的時候,派生類的成員資料還沒有初始化,如果是呼叫派生類中的func,會造成錯誤,記憶體越界甚至崩潰。

-- base::func()

int* vtl = (int*)*((int*)this);

std::cout << "base: " << this << "  vtable: " << vtl << std::endl;

-- deri::func()

int* vtl = (int*)*((int*)this);

std::cout << "deri: " << this << "  vtable: " << vtl << std::endl;

輸出:base: 0028f980  vtable: 003fdc78

deri: 0028f980  vtable: 003fdc98

發現,虛表的位址是不斷變化的。

C 建構函式中呼叫虛函式

我們知道 c 中的多型使得可以根據物件的真實型別 動態型別 呼叫不同的虛函式。這種呼叫都是物件已經構建完成的情況。那如果在建構函式中呼叫虛函式,會怎麼樣呢?有這麼一段 class a virtual void func void test public int m ival class b publ...

構造函式呼叫虛函式

在建構函式中呼叫虛成員函式,雖然這是個不很常用的技術,但研究一下可以加深對虛函式機制及物件構造過程的理解。這個問題也和一般直觀上的認識有所差異。先看看下面的兩個類定義。struct c180 virtual foo struct c190 public c180 virtual foo 父類中有乙個...

構造函式呼叫虛函式

參考stroustrup的回答吧 在建構函式中呼叫虛成員函式,雖然這是個不很常用的技術,但研究一下可以加深對虛函式機制及物件構造過程的理解。這個問題也和一般直觀上的認識有所差異。先看看下面的兩個類定義。struct c180 virtual foo struct c190 public c180 v...