C++ 第二章 类的继承与成员函数

以下分别为public继承,private继承,protected继承所继承的相应成员继承
public不变
protected:
public->protected,private->private,protected->protected
private全变成私有

多继承
在前面的例子中,派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。
多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承。
多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A、类B和类C,那么可以这样来声明派生类D:
class D: public A, private B, protected C{
//类D新增加的成员
}
D 是多继承形式的派生类,它以公有的方式继承 A 类,以私有的方式继承 B 类,以保护的方式继承 C 类。D 根据不同的继承方式获取 A、B、C 中的成员,确定它们在派生类中的访问权限。

#include <iostream>

using namespace std;
class Uobject{};

class AActor :public Uobject
{
public:
	void Start(){}
	void End() {}
};

class IPhysics {
public:
	void Simulate() {};
};

class IAttack {
public:
	void AttackTarget(ACharacter* Tartget) {};
};

class ACharacter :public AActor,public IPhysics,public IAttack
{

};

void main() {
	ACharacter A;
	ACharacter B;
	A.Simulate();
	A.AttackTarget(&B);
}

以上为多继承。为什么要多继承呢?
其好处在于将代码分块,一个类只管理一个区域的东西,或是能够公开一些接口给当前的Character使用
如Iphysic就只管理物理,Actor只管理生命周期,便于维护,如果把他们全都写在Character中会十分麻烦

这样的话上层便不需要理会下层的东西,比如物理,如下

#include <iostream>

using namespace std;
class Uobject{};

class AActor :public Uobject
{
public:
	void Start(){}
	void End() {}
};

class IPhysics {
public:
	void Simulate() {};
};

class IAttack {
public:
	void AttackTarget(ACharacter* Tartget) {};
};

class ACharacter :public AActor,public IPhysics,public IAttack
{

};

bool IsSimlate(IPhysics* P) {
	if (P) {
		P->Simulate();
	}

	return true;
}

void main() {
	ACharacter A;
	ACharacter B;
	A.Simulate();
	A.AttackTarget(&B);
	IPhysics* P = &A;
	IAttack* P2 = &A;
	AActor* p3 = &A;

	IsSimlate(&A);
}

菱形继承问题
如下
在这里插入图片描述
简单来说就是如下:
在这里插入图片描述
Actor与Hello都继承了Uobject
假设我们的Uobject有一个Destroy的方法
那么此时我们要调用Character中的Destroy便会不知道调用哪个;
在这里插入图片描述
在这里插入图片描述
所以多继承一定要注意菱形问题;
最后,漏了一个class
在这里插入图片描述

#include <iostream>

using namespace std;
class Uobject{
public:
	void Destroy() {};
};

class AActor :public Uobject
{
public:
	void Start(){}
	void End() {}
};
class UHello:public Uobject{

};
class IPhysics {
public:
	void Simulate() {};
};

class IAttack {
public:
	void AttackTarget(class ACharacter* Tartget) {};
};

class ACharacter :public AActor,public IPhysics,public IAttack,public UHello
{

};

bool IsSimlate(IPhysics* P) {
	if (P) {
		P->Simulate();
	}

	return true;
}

void main() {
	ACharacter A;
	ACharacter B;
	A.Simulate();
	A.AttackTarget(&B);
	IPhysics* P = &A;
	IAttack* P2 = &A;
	AActor* p3 = &A;

	IsSimlate(&A);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值