在多重继承中,如果发生了如:类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)对虚继承的构造函数的调用,从而保证了虚基类的数据成员不会被多次初始化。