一、虚继承的目的
虚继承主要是为了解决多继承问题中出现同名成员的数据冗余,和调用不方便的问题。
二、虚继承的问题
class M{
public:
M(int d):_d(d){}
int _d;
};
class X:virtual public M{
public:
X(int x):M(x){}
};
class Y:virtual public M{
public:
Y(int y):M(y){}
};
class Z: public X, public Y{
public:
Z(int z):X(1), Y(2), M(z){}
void dis(){
cout << X::_d << endl;
cout << Y::_d << endl;
cout << Z::_d << endl;
}
};
class N: public Z{
public:
N(int n):Z(n), M(n){}
void print(){
cout << X::_d << endl;
cout << Y::_d << endl;
cout << Z::_d << endl;
cout << _d << endl;
}
};
int main()
{
Z z(100);
z.dis();
cout << "------------------" << endl;
z._d = 200;
z.dis();
cout << "------------------" << endl;
N n(10);
//n._d = 20;
z.dis();
cout << "------------------" << endl;
n.print();
cout << "------------------" << endl;
return 0;
}
输出结果:
这里要注意一点:子类Z的构造函数中要显示调用虚基类M的构造函数,负责编译是不通过的。
这个地方开始我一直有个地方不明白,为什么我通过N类把_d的值改成了10,用z.dis()输出结果还是200,用n.print()输出结果就是10,郁闷了我1个小时,最后发现,压根就是两个不同的对象,有个毛线关系,改成n.dis()输出就也是10,,真的是越学越糊涂了……