在多重繼承中,如果發生了如:類B繼承類A,類C繼承類A,類D同時繼承了類B和類C。最終在類D中就有了兩份類A的成員,這在程序中是不能容忍的。當然解決這個問題的方法就是利用虛繼承。
1 class A{ 2 public: 3 int t; 4 A(int a) 5 { 6 t = a; 7 } 8 void fun(); 9 }; 10 11 class B:virtual public A 12 { 13 public: 14 B(int a, int b) :A(a+10) 15 { 16 t1 = b; 17 } 18 ~B(); 19 int t1; 20 }; 21 22 class C :virtual public A 23 { 24 public: 25 C(int a,int c):A(a+20) 26 { 27 t2 = c; 28 } 29 ~C(); 30 int t2; 31 }; 32 33 class D :public B,public C 34 { 35 public: 36 D(int a,int b,int c,int d) :B(a,b),C(a,c),A(a){}//在此必須要給虛基類傳參 37 ~D(); 38 };
在派生時將關鍵字virtual加在相應相應繼承方式前,就可防止在D類中同時出現兩份A類成員。
在實例化D時我們給a傳入一個1,那么在虛基類中的t為何值呢?(注意我們在第14,25行給虛基類的構造函數傳值時都進行了“+”操作。)
而答案是肯定的必然為1,因為在實例化D的時候,只會調用一次虛基類的構造函數,使得虛基類接收到參數也只可能是從實例化D時傳過來的參數。
int mian() { D temp(1,2,3,4); return 0; }
注意:C++編譯系統在實例化D類時,只會將虛基類的構造函數調用一次,忽略虛基類的其他派生類(class B,class C)對虛繼承的構造函數的調用,從而保證了虛基類的數據成員不會被多次初始化。