• C++虚函数和纯虚函数(1)


    转载自:http://www.cnblogs.com/daoluanxiaozi/archive/2011/12/04/2275364.html

    §写在前面的

    学习过C++类的继承与多态的时候,但是很多的童鞋回过头来都忘记之中关于虚函数和纯虚函数的细节,甚至将他们混淆。

    §虚函数

    虚函数是动态多态性的基础,其调用的方式是动态联编(又称晚期联编,简单解释为只有在程序运行时才决定调用基类的还是子类的,系统会根据基类指针所指向的对象来决定要调用的函数);

    非虚函数与其相反,是静态联编(调用已经在编译时期就决定了;在编译时期,系统已经根据指针所属的类型确定了要调用的函数)。

    class shape
    {
    public:
        shape(){};
        void draw()
        {
            画图形;
        }
    };
     
    class rectangle : public shape
    {
    public:
        rectangle(){};
        void draw()
        {
            画方形;
        }
    };
     
    class round : public shape
    {
    public:
        round(){};
        void draw()
        {
            画圆形;
        }
    };
     
    void main()
    {
        shape * s;
     
        s = new rectangle();
        s->draw();
     
        s = new round();
        s->draw();
    }

    我主程序中的意思是要画方形和画圆形,可执行的结果都是画图形(叫你两儿子出来,怎么出来的都是你啊,扯淡么),这很明显不符合我们的要求和多态的要求。所以虚函数必须应运而生。

    class shape
    {
    public:
        shape(){};
        virtual void draw()    //注意这里设置为虚函数
        {
            画图形;
        }
    };
     
    class rectangle : public shape
    {
    public:
        rectangle(){};
        void draw()
        {
            画方形;
        }
    };
     
    class round : public shape
    {
    public:
        round(){};
        void draw()
        {
            画圆形;
        }
    };
     
    void main()
    {
        shape * s;
     
        s = new rectangle();
        s->draw();
     
        s = new round();
        s->draw();
    }

    这就满足我们了,一个是画方形,一个是画圆形。
    发现:即使不在基类shape当中把draw设置为虚函数,我们只要直接在主函数当中直接声明子类的对象,调用draw,这种情况下是符合多态的思想的,

    void main()
    {
      round r;
      r.draw();
    }

    这就有疑问了,为什么还需要virtual关键字(虚函数)的存在呢?

    上面的例子只是一个两个派生类,如果shape有成百上千个派生类,难道我们调用派生类的draw的时候都声明一个派生类的对象吗?很明显不可能,所以虚函数的情况下,我们只要声明一个shape的指针就好了。

  • 相关阅读:
    python的paramiko模块的安装与使用
    python的paramiko模块的安装与使用
    python的paramiko模块的安装与使用
    Python中的getattr()函数详解
    Python中的getattr()函数详解
    Python模块学习——optparse
    Python模块学习——optparse
    Python模块学习——optparse
    pkg_resources----Entry Points为程序提供扩展点
    pkg_resources----Entry Points为程序提供扩展点
  • 原文地址:https://www.cnblogs.com/super119/p/2307010.html
Copyright © 2020-2023  润新知