多继承可以看作是单继承的扩 展。所谓多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。
• 多继承是指派生类可以有一个以上的直接基类。多继承的派 生类定义格式为:
class <派生类名>: [<继承方式>] <基类名1>,
[<继承方式>] <基类名2>,…
{
<成员说明表>
};
– 继承方式及访问控制的规定同单继承。
– 派生类拥有所有基类的所有成员。
– 基类的声明次序决定: • 对基类构造函数/析构函数的调用次序 • 对基类数据成员的存储安排。
例如:
class A { … };
class B { … };
class C : public A, public, B { … };
其中,派生类C具有两个基类(类A和类B),因此,类C 是多继承的。按照继承的规定,派生类C的成员包含了 基类A,B中成员以及该类本身的成员。
• 构造函数的执行次序是: – A()、B()、C() (A()和B()实际是在C()的成员初始 化表中调用。)
• 下面的操作是合法的: c.fa(); c.fb(); c.fc();
多继承的构造函数
多继承的情况下,派生类的构造函数格式如下:
<派生类名>(<总参数表>):<基类名1>(<参数表1>), <基类 名2>(<参数表2>),…<子对象名>(<参数表n+1>),…
{ <派生类构造函数体> }
其中,<总参数表>中各个参数包含了其后的各个分参数表。
多继承下派生类的构造函数与单继承下派生类构造函 数相似,它必须同时负责该派生类所有基类构造函数的调用。同时,派生类的参数个数必须包含完成所有基类初始 化所需的参数个数。
派生类构造函数执行顺序是:
1、先执行所有基类的构造函数,
2、再执行派生类本身构造函数,
3、处于同一层次的各基类构造函数的执行顺序取决于 定义派生类时所指定的各基类顺序,与派生类构造函数 中所定义的成员初始化列表的各项顺序无关。 也就是说,执行基类构造函数的顺序取决于定义派 生类时基类的顺序。可见,派生类构造函数的成员初始 化列表中各项顺序可以任意地排列。
#include <iostream>
using namespace std;
class B1 //基类B1
{ public:
B1(int i)
{b1=i; cout<<"constructor B1."<<i<<endl;}
void print()
{cout<<b1<<endl;}
private:
int b1;
};
class B2 //基类B2
{ public:
B2(int i) { b2=i; cout<<"constructor B2."<<i<<endl;}
void print(){cout<<b2<<endl;}
private:
int b2;
};
class B3 //成员类B3
{ public:
B3(int i)
{ b3=i; cout<<"constructor B3."<<i<<endl;}
int getb3(){return b3;}
private:
int b3;
};
class A : public B2, public B1 //注意基类的顺序,调用构造函数的顺序
{ public:
A(int i, int j, int k, int l) : B1(i), B2(j), bb(k)
{ a=l; cout<<"constructor A."<<l<<endl; }
void print() { B1::print(); B2::print(); cout<<a<<", "<<bb.getb3()<<endl; }
private:
int a;
B3 bb;
};
int main()
{
A aa(1,2,3,4);
aa.print();
return 0;
}