c++之多继承及菱形继承

多继承语法

C++允许一个类继承多个类,但在实际开发中并不建议去使用,可能会引发一些错误难以发现,比如菱形继承

语法:class 子类 : 继承方式 父类1 , 继承方式 父类2 .

多继承语法可能会引发父类中同名成员出现,子类使用时需要加作用域区分

菱形继承

菱形继承的概念:

两个派生类继承同一个基类
又有某个类同时继承两个派生类
这种继承就称为菱形继承,或者钻石继承

问题

两个子类同时继承了父类的数据,当子类的子类使用数据时就会产生二义性  这是需要加作用域
子类的子类,同时继承了两个子类的数据,但是这份数据应只有一份

解决
虚继承:利用虚继承可以解决菱形继承的问题 继承之前加上关键字virtual,此时的父类称虚基类
虚继承之后,此时的两个子类实际上存储着一个指针,而指针指向一个表,表中记录了偏移量,加上偏移地址即可找到所要的数据,也就是此时的只有一份数据
测试

#include<iostream>
using namespace std;
//父类
class Base
{
public:
	int m_Age;
};
//子类1
class Son1:virtual public Base
{
};
//子类2
class Son2 :virtual public Base
{	
};
//子类的子类
class Grandson : public Son1, public Son2
{
};

void test()
{
	Grandson st;
	st.Son1::m_Age = 28;
	st.Son2::m_Age = 18;
	//由于父类中的年龄现在只有一份数据,所以这两个赋值其实是对一个值进行赋值(子类中的虚指针指向同一个数据)

	cout << "st.Son1::m_Age = " << st.Son1::m_Age << endl << endl;//输出18
	cout << "st.Son2::m_Age = " << st.Son2::m_Age << endl;//输出18
	cout << "st.m_Age = " << st.m_Age << endl;//输出18
}
int main()
{
	test();
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值