前言
c++多态是在方法上进行抽象进行分类和统一,而多继承的出现大大提升了c++编程的灵活性和易用性,专业的说法就是提高内聚,降低耦合。但是呢,多继承的使用中一定会遇到基于同一个基类的拍生类再次被某个类所继承的情况,于是
纷争开始了。。。
举个栗子
我们现在设计一个游戏的人物或者叫装备或者叫身体系统,实现思路呢主要是把一个游戏角色的身体拆分为各个部分,每个部分可以单独强化和习得技能什么的。最后由各个部分组成一个完整的角色。
①、首先我们针对一些通用属性,比如等级啊,天赋啊什么的,设计一个基类,就叫素质好了
class 素质
{
public:
素质();
~素质();
protected:
virtual void Get潜力();
virtual void Get力量();
virtual void Get等级();
};
咱可以获取每个装备或者叫身体部分的潜力登记什么的属性。
②、设计基于该类派生的手啊,腿啊,脑袋啊。当然也可以是对应部位的装备。
class 手臂:素质
{
public:
手臂();
~手臂();
protected:
virtual void 打拳();
virtual void 神掌();
virtual void 龙抓手();
virtual void 划水();
};
class 腿 :素质
{
public:
腿();
~腿();
protected:
virtual void 踢腿();
virtual void 蹬脚();
virtual void 跑路();
};
③、我们用这些器官或者叫装备组合成一个人物角色,这里简化代码就只有手和脚了
class 鲁班七号:腿,手臂,素质
{
public:
鲁班七号();
~鲁班七号();
private:
void 组合技1()
{
this->打拳();
this->蹬脚();
this->龙抓手();
}
void 组合技2()
{
this->跑路();
this->神掌();
this->跑路();
}
};
问题
这当然是我们理想中想要的代码,但是实际上却是,鲁班七号类没办法明确他的属性来源,有直接继承的来源,和来自 手 以及腿这三个来源。
而这种冲突也是十分容易理解的,因为继承后我们的素质基类出现了三份,然后自然地出错。
解决方法
c++引入了一个叫做虚基继承的东西,让基于同一个类的的东西仅保留一份,这也正是我们需要的。
在继承类时在前面加上 virtual 即可。
class 鲁班七号:virtual 腿,virtual 手臂,virtual 素质
至于访问控制符,按照设计需求自行加上即可。