C++ 虚拟继承
接下来,我们准备为大家介绍"虚拟继承"
虚拟继承——当派生类继承基类时,使用virtual关键字说明继承的关系,就称为虚拟继承。
虚拟继承的定义格式:
class 派生类名字 : virtual 访问权限 基类
{
};
格式分析:
(1)以class关键字开头。
(2)派生类名字,或称为子类名字
(3)冒号
(4)virtual,说明是虚拟继承
(5)访问权限,公有public或私有private
(6)基类名字
接下来,我们结合例子作进一步的学习
例子:
//========================
//定了一个描述武器的类Weapon
//========================
class Weapon
{
public:
int Type; //武器的类型
int x; //武器位置的X坐标
int y; //武器位置的Y坐标
void SelectWeapon(int stw); //选择武器的方法
}
void Weapon::SelectWeapon(int stw)
{
if(stw == 1 )
Type=2;
if(stw == 2 )
Type=3;
}
//========================
//定义了一个描述手枪的类Gun,虚拟继承了Weapon
//========================
class Gun : virtual public Weapon
{
public:
int x;
void Gshoot(); //定义了方法Gshoot
}
void ShotGun::Gshoot() //实现Gshoot
{
x=x+1;
}
//========================
//定义了一个描述散弹枪的类ShotGun,虚拟继承了Weapon
//========================
class ShotGun : virtual public Weapon
{
public:
int x;
int y;
void SGshoot(); //定义了方法SGshoot
}
void ShotGun::SGshoot() //实现SGshoot
{
x=x+1;
y=y+1;
}
//========================
//定义了一个描述角色类Role,并继承了手枪类与散弹枪类
//========================
class Role:public ShotGun,public Gun
{
public:
int x; //角色的位置X
int y; //角色的位置Y
}
void main()
{
Role r1; //定义了r1对象
r1.x = 10; //设置角色X坐示为10
r1.y = 20; //设置角色Y坐标为20
r1.SelectWeapon(1); //正确,但是,如果ShotGun类与Gun类在继承Weapon类时
没有使用virtual进行虚拟继承,那么,r1对象调用
SelectWeapon方法时就会报错。
r1.Gshoot(); //调用了Gun类中Gshoot方法
r1.SGshoot(); //调用了ShotGun类中SGshoot方法
}
分析:
虚拟继承
Weapon | 因为进行了虚拟继承,所以,在内存中Weapon只有一个 |
Gun | Gun继承了Weapon |
ShotGun | ShotGun继承了Weapon |
Role | Role继承了Gun与ShotGun |
r1.SelectWeapon | 所以,r1调用SelectWeapon时就没问题 |
如果是非虚拟继承
Weapon | |
Gun | Gun继承了Weapon |
Weapon | |
ShotGun | ShotGun继承了Weapon |
Role | Role继承了Gun与ShotGun |
r1.SelectWeapon | 所以,r1调用SelectWeapon时就出错 |
如果是非虚拟继承,那么,在Gun继承Weapon后,在内存中会出现一个Weapon,而ShotGun继承Weapon后,在内存中会再出现一个Weapon,这样,在r1调用SelectWeapon方法时,就会出现,不知道调用哪一个Weapon中的SelectWeapon方法了,所以,就会出错。
通过上面的学习,相信大家对虚拟继承有了一个初步了解,但是,如何灵活地运用这个知识点呢?那么,我们就要通过下方的按钮进入到游戏中,然后,运用该知识点去完成任务,这样,才可以加深大家对该知识点的理解和运用,以及“尽快进入到编程的状态”。
要达到灵活运用,是需要通过不停地反复训练才可以做到,所以,不要停留在理论规则上面,快动起来吧!
(通过游戏模式学习与训练,需要在电脑上运行)