談談關於建構函式中呼叫虛函式的情況,僅討論單繼承,不考慮虛擬繼承和多重繼承。
測試平台: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...