以下分别为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);
}