C++ 错误的虚函数

 

 

  接下来,我们准备为大家介绍"错误的虚函数"

 

   什么是错误的虚函数呢?

 

   首先,我们要回顾一下虚函数的特性,子类重新定义和实现基类中的方法,而方法的名字,参数的类型,参数的个数,返回类型,都与基类的方法定义一样。

 

   所以,通过这个回顾,我们会提出另一个问题,如果子类中的虚函数的参数类型,或参数的个数,或返回类型,其中之一或全部与基类中的虚函数不一样时,会怎么样呢?如果,在这种情况下面,编译不会进行延迟,而只会在基类中寻找匹配的方法,如果,只是参数的类型或返回的类型不一样,那么,将会进行类型的隐式转换,再匹配基类中的方法,如果还是匹配不上,就会发出编译出错

    

 

 

 

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

 

   例子:

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

    {

      public:

        int x; 

        int y;      

        virtual void shoot(int  type);  //定义了虚函数shoot,带一个整形参数

    }

 

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

    {

      if( type == 1 )

        x=x+1;

    }

 

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

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

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

    class ShotGun :public Weapon  

    {

      public:

        virtual void shoot(float  type);  //定义了虚函数shoot,带一个浮点参数

    }

 

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

    {

      if( type == 1.0 )

      {

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

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

      }

    }

 

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

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

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

    void test(Weapon &p) 

    {

      int i=1;

      p.shoot(i);    

    }

 

 

  void main()

  {

    Weapon   wp1;

     ShotGun  sg1;

    

 

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

             参数是Weapon类的对象wp1

 

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

             ShotGun类的shoot方法的参数类型是float,与基类Weapon中的方法shoot的

             参数类型不一样,所以,编译时,只会在基类Weapon中寻找匹配的方法,

             然后,隐式转换参数类型float为int,从而,匹配了基类Weapon中的方法

             shoot(int  type)

  }

 

 

 

 

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

 

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

 

 

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

进入游戏学习与训练