3.多继承和二义性

在C++中,类的继承支持多继承,也就是一个类可以继承多个基类,但这样就会产生一些问题,例如:B和C继承了A,而B和C共同派生出了D,如果D想访问B和C继承于A的方法就会产生二义性,所以在访问时,需要指定基类名。

#include<iostream>
class Aclass
{
public:
	Aclass()
	{
		std::cout << "Aclass create\n";
	}
	void print()
	{
		std::cout << "from Aclass\n";
	}
};
class Bclass:public Aclass
{
public:
	Bclass()
	{
		std::cout << "Bclass create\n";
	}
	void print()
	{
		std::cout << "from Bclass\n";
	}
};
class Cclass:public Aclass
{
public:
	Cclass()
	{
		std::cout << "Cclass create\n";
	}
	void print()
	{
		std::cout << "from Cclass\n";
	}
};
class Dclass :public Bclass, public Cclass
{
public:
	Dclass()
	{
		std::cout << "Dclass create\n";
	}
};

void main()
{
	Dclass D1;
	D1.Bclass::print();//需要指定基类名,否则将报错
	system("pause");
}

在VS2013运行后得到结果,可以成功访问,但有没有注意到我们创建一个Dclass却创建了两次Aclass,因为D继承了B、C。

在类非常庞大时,会非常的浪费内存。C++提供了虚基类的概念来解决这个问题:

只需在Bclass和Cclass继承Aclass前面加上virtual

class Bclass:virtual public Aclass
class Cclass:virtual public Aclass

这样在创建Dclass时Aclass就只会创建一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值