- 多继承的派生类构造和访问
- 多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员
- 执行顺序:与单继承构造函数类似;多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序
- 一个派生类对象拥有多个直接或者间接基类的成员;不同成员访问不会出现二义性;如果不同的基类有同名成员,派生类对象访问时应该加以识别
案例:
#include<iostream>
using namespace std;
class B
{
public:
int b;
B()
{
cout << "B构造函数\n";
}
};
class B1 : virtual public B
{
public:
int b1;
};
class B2 : virtual public B
{
public:
int b2;
};
class C :public B1, public B2
{
public:
int c;
};
void main()
{
C c1;
//c1.b = 500; //
//1 不添加virtual关键字,发现 B构造函数执行了两次
/*
B构造函数
B构造函数
请按任意键继续. . .
*/
//2 添加virtual关键字,发现 B构造函数执行了 1 次
//结论: 若在多继承路径上有一个公共基类, 那么在继承路劲的某处汇合点, 和这个公共基类会在派生类的 对象中 产生多个 基类子对象
// 解决方法: 对这个基类声明为 虚继承
// 比如 c1::B1::b c1::B2::b 是同一个子对象
system("pause");
}
- 加上virtual关键字后,C++编译器 会再给变量偷偷增加属性
案例:
class B
{
public:
int b;
};
class B1 : virtual public B
{
public:
int b1;
};
class B2 : public B
{
public:
int b2;
};
void main()
{
cout << sizeof(B) << endl; //4
cout << sizeof(B1) << endl; //12
cout << sizeof(B2) << endl; //8
system("pause");
}