一.多继承
派生类都只有一个基类,成为单继承。除此之外,C++也支持多继承,即一个派生类可以有两个或多个基类。
多继承的语法很简答,将多个基类用逗号隔开即可,例如已申明了类A、类B和类C,那么可以这样来声明类D。
class D: public A, private B, protected C
{ //类D新增加的成员
}
D 是多继承形式的派生类,它以公有的方式继承 A 类,以私有的方式继承 B 类,以保护的方式继承 C 类。D 根据不同的继承方式获取 A、B、C 中的成员,确定它们在派生类中的访问权限。
多继承形式下的构造函数和单继承形式相同,只要在派生类的构造函数中调用多个基类的构造函数。以上面的 A、B、C、D 类为例,D 类构造函数的写法为:
D(形参列表) : A(实参列表),B(实参列表),C(实参列表) { //其他操作}
基类构造函数的调用顺序和它们在派生类构造函数中出现的顺序无关,而是和声明派生类时基类的出现顺序相同
#include <iostream>
using namespace std;
class BaseA
{
public:
BaseA(int a,int b);
~BaseA();
protected:
int m_a;
int m_b;
};
BaseA::BaseA(int a, int b):m_a(a),m_b(b)
{
cout << "BaseA constructor" << endl;
}
BaseA::~BaseA()
{
cout << "BaseA destructor" << endl;
}
class BaseB
{
public:
BaseB(int c,int d);
~BaseB();
protected:
int m_c;
int m_d;
};
BaseB::BaseB(int c, int d):m_c(c),m_d(d)
{
cout << "BaseB constructor" << endl;
}
BaseB::~BaseB()
{
cout << "BaseB destructor" << endl;
}
class Derived:public BaseA,public BaseB
{
public:
Derived(int a,int b,int c,int d,int e);
~Derived();
public:
void show();
private:
int m_e;
};
Derived::Derived(int a, int b, int c, int d, int e):BaseA(a,b),BaseB(c,d),m_e(e)
{
cout << "Derived constructor" << endl;
}
Derived::~Derived()
{
cout << "Derived destructor" << endl;
}
void Derived::show()
{
cout<<m_a<<", "<<m_b<<", "<<m_c<<", "<<m_d<<", "<<m_e<<endl;
}
int main()
{
Derived d(1,2,3,4,5);
d.show();
return 0;
}
运行结果: 多多继承形式下析构函数的执行顺寻和构造函数的执行顺序与单继承相同
[root@localhost CPP]# ./djc3_14
BaseA constructor
BaseB constructor
Derived constructor
1, 2, 3, 4, 5
Derived destructor
BaseB destructor
BaseA destructor
二.命名冲突
当两个或多