• 虚函数、纯虚函数详解


    原文链接

    纯虚函数的作用

         在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。

    1.首先:强调一个概念 
           定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
           定义一个函数为纯虚函数,才代表函数没有被实现。定义他是为了实现一个接口,起到一个规范的作用,规范继承这个。类的程序员必须实现这个函数。 

    2.关于实例化一个类: 
    有纯虚函数的类是不可能生成类对象的,如果没有纯虚函数则可以。比如: 
    class CA 

    public: 
        virtual void fun() = 0;  // 说明fun函数为纯虚函数 
        virtual void fun1(); 
    }; 

    class CB 

    public: 
       virtual void fun(); 
       virtual void fun1(); 
    }; 

    // CA,CB类的实现 
    ... 

    void main() 

        CA a;   // 不允许,因为类CA中有纯虚函数 
        CB b;   // 可以,因为类CB中没有纯虚函数 
        ... 


    3.虚函数在多态中间的使用: 
       多态一般就是通过指向基类的指针来实现的。 

    4.有一点你必须明白,就是用父类的指针在运行时刻来调用子类: 
    例如,有个函数是这样的: 
    void animal::fun1(animal *maybedog_maybehorse) 

         maybedog_maybehorse->born();

    参数maybedog_maybehorse在编译时刻并不知道传进来的是dog类还是horse类,所以就把它设定为animal类,具体到运行时决定了才决定用那个函数。也就是说用父类指针通过虚函数来决定运行时刻到底是谁而指向谁的函数。

    5.用虚函数 
    #include <iostream.h> 

    class animal 

    public: 
         animal(); 
         ~animal(); 
         void fun1(animal *maybedog_maybehorse); 
         virtual void born(); 
    }; 

    void animal::fun1(animal *maybedog_maybehorse) 

         maybedog_maybehorse->born(); 
    }

    animal::animal() { } 
    animal::~animal() { } 
    void animal::born() 

         cout<< "animal"; 

    ///////////////////////horse
    class horse:public animal 

    public: 
         horse(); 
         ~horse(); 
         virtual void born(); 
    }; 

    horse::horse() { } 
    horse::~horse() { } 
    void horse::born()

         cout<<"horse"; 

    ///////////////////////main
    void main() 

         animal a; 
         horse b; 
         a.fun1(&b); 


    //output: horse

    6.不用虚函数 
    #include <iostream.h> 
    class animal 

    public: 
         animal(); 
         ~animal(); 
         void fun1(animal *maybedog_maybehorse); 
         void born(); 
    }; 

    void animal::fun1(animal *maybedog_maybehorse) 

         maybedog_maybehorse->born(); 


    animal::animal() { }
    animal::~animal() { } 
    void animal::born() 

         cout<< "animal"; 

    ////////////////////////horse
    class horse:public animal 

    public: 
         horse(); 
         ~horse(); 
         void born(); 
    }; 

    horse::horse() { } 
    horse::~horse() { } 
    void horse::born()

         cout<<"horse"; 

    ////////////////////main
    void main() 

         animal a; 
         horse b; 
         a.fun1(&b); 

    //output: animal
  • 相关阅读:
    zoj 1649 Rescue
    poj 1659 Frogs' Neighborhood
    hdu 1385 Minimum Transport Cost
    hdu 2680 Choose the best route
    写了一下午的dijkstra。突然发现我写的根本不是dijkstra。。。。是没优化过的BFS.......
    hdu 1548 A strange lift
    hdu 2066 一个人的旅行
    hdu 2544 最短路
    洛谷 P3253 [JLOI2013]删除物品 解题报告
    洛谷 P10P1343 地震逃生 改错
  • 原文地址:https://www.cnblogs.com/wangkangluo1/p/2497777.html
Copyright © 2020-2023  润新知