zoukankan      html  css  js  c++  java
  • 虚函数、纯虚函数详解

    转自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
    转载请注明出处,有技术问题,欢迎互相交流,或者留言.
  • 相关阅读:
    ios 将Log日志重定向输出到文件中保存
    IOS中GPS定位偏移纠正(适用于Google地图)
    java与IOS之间的RSA加解密
    [iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端一)
    [IOS] Storyboard全解析-第一部分
    NTP时间同步
    Prthon多线程和模块
    Python循环语句,对象
    Python起步学习
    Nginx实战之反向代理WebSocket的配置实例
  • 原文地址:https://www.cnblogs.com/sunliming/p/2423501.html
Copyright © 2011-2022 走看看