虚拟继承:
顾名思义就是继承了但不给开辟空间;
class B0 //此段代码中B0就是虚基类
{
public:
B0() : m(0)
{}
public:
int m;
};
class B1 : virtual public B0 //B1虚拟继承B0
{
public :
B1() : n(0)
{}
public:
int n;
};
class B2 : virtual public B0 //B2虚拟继承B0
{
public:
B2() : n(0)
{}
public:
int n;
};
class D : public B1, public B2
{
public:
D() : x(0)
{}
public:
int x;
};
int main()
{
D d;
//因为B1,B2中都有同名的n变量,所以当D继承B1,B2时要指明访问的是谁的n;要加::(作用域限定符)
d.B1::n = 10;
d.B2::n = 20;
d.m = 100; //指的是B0中的m空间
//d.B1::m = 200; //这里的作用域无论是哪个类都是在修改B0中的m;
return 0;
}
通过虚拟继承,B1,B2,B0共享一块m空间,B1,B2不为m开辟空间,只是虚拟的继承;
注意:
在派生类对象的创建过程中,构造顺序是:按虚基类的声明顺序先构造虚基类,再按非虚基类的声明顺序构造非虚基类,再按定义顺序构造成员对象的构造函数,最后构造派生类对象
;
class B0
{
public:
B0(){}
~B0(){}
};
class B1
{
public:
B1(){}
~B1(){}
};
class B2
{
public:
B2(){}
~B2(){}
};
class D : public B0, virtual public B1, public B2
{
public:
D(){}
~D(){}
private:
B0 b0;
B1 b1;
B2 b2;
};
int main()
{
D d;
//则其构造顺序为B1, B0, B2, b0, b1, b2, d
return 0;
}