C++学习笔记12
1.多重继承
多重继承(multiple inheritance)是指从多个直接基类中产生派生类的能力。
class D{......};
class B: public D{......};
class A: public D{......};
class C: public B, public A{.....};
上面这段代码是有问题的,C继承了A和B,因为A,B都继承D。这使得C从A和B中继承了相同的构造函数。要解决上面问题就要用虚拟继承格式
格式:class 类名: virtual 继承方式 父类名
class D{......};
class B: virtual public D{......};
class A: virtual public D{......};
class C: public B, public A{.....};
在虚继承(virtual inheritance)这种机制下,不论虚基类在继承体系出现了多少次,在派生类中都只包含唯一一个共享的虚基类子对象。
2. 虚继承的对象构造方式
含有虚基类的对象的构造顺序与一般的顺序稍有区别:首先使用提供给最底层派生类构造函数的初始值初始化该对象的虚基类子部分,接下来按照直接基类在派生列表中出现的次序依次对其进行初始化。
3. 构造函数与析构函数的次序
一个类可以有多个虚基类。此时,这些虚的子对象按照它们在派生列表中出现的顺序从左向右依次构造。
编译器按照直接基类的声明顺序对其依次进行检查,以确定其中是否含有虚基类。如果有,则先构造虚基类,然后按照声明的顺序逐一构造其他非虚基类。
4. 实例
#include <iostream>
using namespace std;
//基类
class D
{
public:
D(){cout<<"D()"<<endl;}
~D(){cout<<"~D()"<<endl;}
protected:
int d;
};
class E
{
public:
E(){cout<<"E()"<<endl;}
~E(){cout<<"~E()"<<endl;}
protected:
int e;
}
class B:virtual public D
{
public:
B(){cout<<"B()"<<endl;}
~B(){cout<<"~B()"<<endl;}
protected:
int b;
};
class A:virtual public D
{
public:
A(){cout<<"A()"<<endl;}
~A(){cout<<"~A()"<<endl;}
protected:
int a;
};
class C:public B, public A, virtual public E
{
public: //注意这里的构造顺序,先虚基类后其他类
C() : D(), E(), B(), A()
{
cout<<"C()"<<endl;
}
~C()
{
cout<<"~C()"<<endl;
}
protected:
int c;
};
int main()
{
cout << "Hello World!" << endl;
C c; //D, E, B, A ,C
cout<<sizeof(c)<<endl;
return 0;
}