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方法了,所以,就会出错。

 

 

 

  通过上面的学习,相信大家对虚拟继承有了一个初步了解,但是,如何灵活地运用这个知识点呢?那么,我们就要通过下方的按钮进入到游戏中,然后,运用该知识点去完成任务,这样,才可以加深大家对该知识点的理解和运用,以及“尽快进入到编程的状态”

 

  要达到灵活运用,是需要通过不停地反复训练才可以做到,所以,不要停留在理论规则上面,快动起来吧!

 

 

(通过游戏模式学习与训练,需要在电脑上运行)

进入游戏学习与训练