虚基类
意义:假设定义了一个公共基类A。类B和类C都由类A公有派生,类D由类B和类C公有派生。显然D包含类A的两个拷贝,不仅多占用内存,而且还造成多个拷贝的数据不一致。
不定义虚基类的效果如下:
class A {public:int x;void SetX(int a) { x = a; }A(int a = 0) { x = a; cout << "调用A构造函数" << endl;}void PA() { cout << "PA" <<x<< endl; }
};
class B :public A {
public:int y;void SetY(int a) { y = a; }B(int a = 0, int b = 0):A(a) { y = b; cout << "调用B构造函数" << endl;}void PB() { cout << "PB" << "x="<<x<<"y="<<y<<endl; }
};
class C :public A {
public:int z;void SetZ(int a) { z= a; }C(int a = 0, int b = 0) :A(a) { z = b; cout << "调用C构造函数" << endl; }void PC() { cout << "PC" <<"x="<<x<<"z="<<z<<endl; }
};
class D :public B, C {int m;
public:D(int a = 0, int b = 0, int c = 0,int d=0,int e=0):B(a,b),C(c,d) { m = e; cout << "调用D构造函数" << endl;}void PD() { PB();PC();cout<< "x=" <<x << "y=" << y << "z=" << z<< endl;}
};
已上代码会产生一个错误,在类D中无法识别数据成员x是哪一个。可以用限定符来限定,如下:
void PD() { PB();PC();cout<< "x=" << B::x << "y=" << y << "z=" << z<< endl;
所以从调试结果可以看出 构造了两个类A的对象。