當某類的部分或者全部直接基類是從另乙個共同基類派生而來時,在這些直接基類中從上一級共同基類繼承來的成員就擁有相同的名稱。在派生類的物件中,這些同名資料成員在記憶體中同時擁有多個副本,同乙個函式名會有多個對映。可以使用作用域分辨符來唯一標識並分別訪問它們,也可以講共同基類設定為需基類,這時從不同路徑繼承過來的同名函式成員在記憶體中就只有乙份副本,同乙個函式也只有乙個對映。這樣就解決了同名成員的唯一標識問題。
先看下圖:
**:
class base0 ;
class base1 : public base0 ;
class base2 : public base0 ;
class derived : public base2, public base1 ;
可知,base1和base2從base0繼承下來的var0和fun()在非virtual繼承自base0的情況下,var0和fun()在derived中存在多個副本,使得derived變得更加的臃腫。
則derived類成員情況如圖:
可以使用作用域分辨符來訪問它們,如下:
derived dr;
dr.base1::var0 = 2;
dr.base1::fun();
以下是虛基類繼承方式:
派生時base0為虛基類,再以base1、base2作為虛基類的公有派生產生了新類derived。這時的derived類中,通過base1和base2兩條路徑繼承下來的基類base0中的var0和fun()只有乙份副本。
則derived類成員情況如圖
注意 : 如果虛基類宣告又非預設形式的(即帶引數的)建構函式,並且沒有宣告預設形式的建構函式,此時,在整個繼承關係中,直接或者間接繼承虛基類的所有派生類,都必須在建構函式的成員初始化列表中列出對虛基類的初始化。
**:
class base0
int var0;
void fun();};
class base1 : public base0
int var1;};
class base2 : public base0
int var2;
};class derived : public base2, public base1
int var;
void fun();
};
int main()
建立derived物件d時,直接呼叫了base0、base1、base2的建構函式,但是並不會對base0中的var0初始化三次!c++編譯器對此種情況進行了處理,建立物件時,如果這個物件中含有從虛基類繼承來的成員,則虛基類的成員由是由最遠派生類(在這裡是derived類)的建構函式通過呼叫虛基類的建構函式進行初始化的,而該派生類的其他基類(即上例中的base1和base2)對虛基類建構函式的呼叫都自動被忽略。 C 虛基類建構函式
c 虛基類建構函式 下面文章詳細介紹c 虛基,所謂c 虛基類 是由最派生類的建構函式通過呼叫虛基類的建構函式進行初始化的,但前提是要深入理解到底什麼是c 虛基類,及他是怎麼執行的。前面講過,為了初始化基類的子物件,派生類的建構函式要呼叫基類的建構函式。對於虛基類來講,由於派生類的物件中只有乙個虛基類...
虛基類的建構函式
虛基類的建構函式 include using namespace std class base class base1 virtual public base class base2 virtual public base class derived public base1,public base...
c 虛基類之建構函式填空
虛基類之建構函式填空 試題描述 請仔細閱讀,補充下面 中的空白。c 類改錯b c 繼承改錯b c 典型運算子過載之集合類填空 c 虛基類之建構函式填空 c 類靜態成員之英雄類 c 純虛函式之再談星際爭霸 必要的標頭檔案等,可能為多條語句 基類a類 從虛基類a公有派生b類 從虛基類a公有派生c類 類d...