为什么要虚基类?
看如下代码:
#include <iostream>
using namespace std;
class Base0 {
public:
int var0;
void fun0() { cout << "Member of Base0" << endl; }
};
class Base1: public Base0 {
public:
int var1;
};
class Base2: public Base0 {
public:
int var2;
};
class Derived: public Base1, public Base2 {
//定义派生类Derived
public:
int var;
void fun() {
cout << "Member of Derived" << endl;
}
};
int main() {
Derived d;
d.Base1::Base0::var0 = 2; //报错 var0不明确
d.Base2::Base0::var0 = 3; //报错 var0不明确
cout<<d.var0<<endl; //报错 var0不明确
return 0;
}
Base1
,Base2
均继承于Base0
,此时Derived
又继承于Base1
,Base2
。于是,在这种情况下,Derived
对象中会有两个Base0
对象,当想去获得d.var0
的时候,编译器会搞不清楚到底要获得哪个Base0
对象的var0
,索性直接认为这是一种危险的操作,直接无法编译。
正确的做法是继承时声明为虚基类
#include <iostream>
using namespace std;
class Base0 {
public:
Base0(int var) : var0(var) { }
int var0;
void fun0() { cout << "Member of Base0" << endl; }
};
class Base1: virtual public Base0 {
public:
Base1(int var) : Base0(var) { }
int var1;
};
class Base2: virtual public Base0 {
public:
Base2(int var) : Base0(var) { }
int var2;
};
class Derived: public Base1, public Base2 {
public:
Derived(int var) : Base0(var), Base1(var), Base2(var)
{ }
int var;
void fun()
{ cout << "Member of Derived" << endl; }
};
int main() { //程序主函数
Derived d(1);
d.var0 = 2; //直接访问虚基类的数据成员
d.fun0(); //直接访问虚基类的函数成员
return 0;
}
注意声明虚基类继承
class Base1: virtual public Base0
这样一来,最远派生类会认为最远基类为唯一的基类,而不会产生二义性