C++ 多态与虚函数

 

 

  接下来,我们准备为大家介绍"多态"

 

   多态——在子类中,重载基类中的方法,就称为“多态”,简单来说,就是在子类中,对基类中的方法,再定义,并重新实现就称为“多态”。

 

   举个例子:在一个游戏中,定义了一个武器类,而武器类里面定义一个射击方法Shoot,而游戏中有多种不同类型的武器,例如:散弹枪,手枪,炸弹等,而不同武器的子弹移动的路径是不一样的,但是,它们都希望使用武器类中的属性与Shoot方法。

   所以,就可以通过这些不同类型的武器先继承“武器类”,然后,在各自在子类中重新定义Shoot方法,并重新实现Shoot,这样,就可以在子类中做到即可以使用“武器类”中的属性,又可以使用Shoot法让不同类型武器的子弹作出不同的路径移动。

    

  虚函数

   (1)虚函数的作用就是为了说明该函数是用于多态,而虚函数就是在类中的方法定义的开始位置加入virtual关键字。

   (2)在编译时,当发现有virtual关键字时,就会进行延迟编译,直到具体的调用代码时,才确认是基类还是子类的方法。

 

   虚函数的特性:

    (1)子类重新定义和实现基类中的方法,而方法的名字,参数的类型,参数的个数,返回类型,都与基类的方法定义一样。

    (2)必须是通过继承以后,在子类中实现所继承的基类中的方法,而不是其它类中的方法。

    (3)在基类中声明了virtual,被声明的虚函数可以传给其子类,所以,在子类中的虚函数可以在定义时不加上virtual,但是,加上也没错。

 

 

 

  接下来,我们结合例子作进一步的学习

 

   例子:

    class Weapon          //定了一个描述武器的类Weapon

    {

      public:

        int Type;          //武器的类型

        int x; 

        int y;      

        virtual void shoot();  //定义了虚函数shoot,用于多态

    }

 

    void Weapon::shoot()   //实现多态的方法

    {

      x=x+1;

    }

 

    //========================

   //定义了一个描述散弹枪的类ShotGun并继承了Weapon类

   //========================

    class ShotGun :public Weapon  

    {

      public:

        virtual void shoot();  //定义了虚函数shoot,用于多态

    }

 

    void ShotGun::shoot()   //实现多态的方法

    {

      x=x+1;    //可以使用基类Weapon中的公有属性x

      y=y+1;    //可以使用基类Weapon中的公有属性y

    }

 

   //========================

   //定义了普通的函数test,参数接收Weapon类的接针对象

   //========================

    void test(Weapon &p) //定义了普通的函数test,参数接收Weapon类的接针对象

    {

      p.shoot();    //根据参数p来决定调用的是Weapon类中的shoot,

               还是ShotGun类中的shoot

    }

 

  void main()

  {

    Weapon wp1;

    wp1.shoot();  //调用了Weapon类中的shoot

 

     ShotGun sg1;

     sg1.shoot();  //调用了ShotGun类中的shoot

 

    test(wp1);   //test函数中,参数p调用了Weapon类中的shoot,因为,

             参数是Weapon类的对象wp1

    test(sg1);    //test函数中,参数p调用了ShotGun类中的shoot,因为,

             参数是ShotGun类的对象sg1

  }

 

 

 

 

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

 

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

 

 

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

进入游戏学习与训练