C++基础知识篇(四)——多继承、虚继承和虚基类、向上转型

一.多继承

派生类都只有一个基类,成为单继承。除此之外,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

 二.命名冲突

当两个或多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值