2012-11-22 20 views
0

假設我有這樣的其中是隻有參數化構造函數的類中初始化的vptr(虛擬指針)?

class Base 
{ 
    private: 
     int i; 
     int j; 
    public: 
     Base(int i) 
     { 
      this->i = i; 
      j = 0; 
     } 
     Base(int i, int j) 
     { 
      this->i = i; 
      this->j = j; 
     } 
     virtual void f() 
     { 
      cout<<"in base f()"<<endl; 
     } 
}; 

vptr的一類被在構造函數中的開頭初始化。但在這種情況下,沒有默認構造函數,只有2個參數化構造函數。 VPTR將在哪裏初始化?

+2

爲什麼你給* default *構造函數指定一些特別的重要性?所有構造函數都以完全相同的方式初始化vptr。在這方面沒有什麼特別的。 – AnT

+0

@AndreyT:我沒有想到所有的構造函數都會初始化vptr。後來,在看到答案後,我的懷疑被清除了。 – bibbsey

回答

3

哪裏的vptr(虛擬指針)在僅具有參數化的構造一個類初始化?

要嚴格技術,這是完全實施定義。
然而,幾乎已知的編譯器通過vptr和v-table機制實現動態分派。所有這些編譯器都會初始化vptr以指向它自己的v-表,在中的每個構造函數的成員初始化列表

喜歡的東西:

Base::Base(...arbitrary params...) 
    : __vptr(&Base::__vtable[0]) ← supplied by the compiler, hidden from the programmer 
{ 

} 

This C++ FAQ解釋了到底發生了什麼一個要點。

3

每個構造函數都會首先初始化vptr僞字段。你可以想象它是每個C++類的第一個隱藏字段,它有一些virtual成員函數。

理論上可以在沒有虛擬表指針的情況下實現虛函數,但我知道沒有通用的C++實現。

相關問題