武汉c培训
达内武汉中心

15271940953

热门课程

武汉C++培训:虚函数详解

  • 时间:2016-05-09
  • 发布:武汉C++培训
  • 来源:c语言教程

虚函数对于多态具有决定性的作用,有虚函数才能构成多态。上节的例子中,你可能还未发现虚函数的用途,不妨来看下面的代码。

这个例子,我们假设你正在玩一款军事游戏,敌人突然发动了地面战争,于是你命令陆军、空军及其所有现役装备进入作战状态。

    #include <iostream>
    using namespace std;
    //军队
    class Troops{
    public:
    virtual void fight(){ cout<<"Strike back!"<<endl; }
    };
    //陆军
    class Army: public Troops{
    public:
    void fight(){ cout<<"--Army is fighting!"<<endl; }
    };
    //99A主战坦克
    class _99A: public Army{
    public:
    void fight(){ cout<<"----99A(Tank) is fighting!"<<endl; }
    };
    //武直10武装直升机
    class WZ_10: public Army{
    public:
    void fight(){ cout<<"----WZ-10(Helicopter) is fighting!"<<endl; }
    };
    //长剑10巡航导弹
    class CJ_10: public Army{
    public:
    void fight(){ cout<<"----CJ-10(Missile) is fighting!"<<endl; }
    };
    //空军
    class AirForce: public Troops{
    public:
    void fight(){ cout<<"--AirForce is fighting!"<<endl; }
    };
    //J-20隐形歼击机
    class J_20: public AirForce{
    public:
    void fight(){ cout<<"----J-20(Fighter Plane) is fighting!"<<endl; }
    };
    //CH5无人机
    class CH_5: public AirForce{
    public:
    void fight(){ cout<<"----CH-5(UAV) is fighting!"<<endl; }
    };
    //轰6K轰炸机
    class H_6K: public AirForce{
    public:
    void fight(){ cout<<"----H-6K(Bomber) is fighting!"<<endl; }
    };
    int main(){
    Troops *p = new Troops;
    p ->fight();
    //陆军
    p = new Army;
    p ->fight();
    p = new _99A;
    p -> fight();
    p = new WZ_10;
    p -> fight();
    p = new CJ_10;
    p -> fight();
    //空军
    p = new AirForce;
    p -> fight();
    p = new J_20;
    p -> fight();
    p = new CH_5;
    p -> fight();
    p = new H_6K;
    p -> fight();
    return 0;
    }

运行结果:

Strike back!
--Army is fighting!
----99A(Tank) is fighting!
----WZ-10(Helicopter) is fighting!
----CJ-10(Missile) is fighting!
--AirForce is fighting!
----J-20(Fighter Plane) is fighting!
----CH-5(UAV) is fighting!
----H-6K(Bomber) is fighting!

这个例子中,由于派生类比较多,如果不使用多态,那么就需要定义多个变量,很容易造成混乱。有了多态,只需要一个变量 p,就可以调用所有派生类的虚函数。

从这个例子中也可以发现,对于具有复杂继承关系的大中型程序,多态可以增加其灵活性,小程序凸显不出多态的威力。

另外注意:
1) virtual 关键字仅用于函数声明,如果函数是在类外定义,则不需要再加上virtual关键字。

2) 为了方便,你可以只将基类中的函数声明为虚函数,所有派生类中具有覆盖关系的同名函数都将自动成为虚函数。
上一篇:武汉C++培新:多态的概念及前提条件
下一篇:武汉C++培训:虚析构函数
选择城市和中心
贵州省

广西省

海南省