• 虚函数、纯虚函数详解


    转自http://www.cppblog.com/ElliottZC/archive/2007/07/20/28417.html

    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
    转载请注明出处,有技术问题,欢迎互相交流,或者留言.
  • 相关阅读:
    专职DBA-MySQL体系结构与基本管理
    JSON
    MIME类型
    文件上传下载
    response常用的方法
    2020.11.27小记
    HTTP请求状态码
    1561. Maximum Number of Coins You Can Get
    1558. Minimum Numbers of Function Calls to Make Target Array
    1557. Minimum Number of Vertices to Reach All Nodes
  • 原文地址:https://www.cnblogs.com/sunliming/p/2423501.html
Copyright © 2020-2023  润新知