zoukankan      html  css  js  c++  java
  • 没有虚函数情况下的函数覆盖(以原始指针的类型为准)

    #include "stdafx.h"
    
    #include <iostream>
    using namespace std;
    
    class shape
    {
    public:
        shape(){};
        void draw()
        {
            cout<<" shape "<< endl;
        }
    };
    
    class rectangle : public shape
    {
    public:
        rectangle(){};
        void draw()
        {
            cout<<" rectangle "<< endl;
        }
    };
    
    class round : public shape
    {
    public:
        round(){};
        void draw()
        {
            cout<<" round "<< endl;
        }
    };
    
    void main()
    {
        shape * s;
        
        s = new rectangle();
        s->draw();
        
        s = new round();
        s->draw();
    }

    结果输出两个shape

    把基类改一改:

    class shape
    {
    public:
    shape(){};
    virtual void draw()
    {
    cout<<" shape "<< endl;
    }
    };

    就可以输出一个rectangle,一个round了.

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

    注意:即使不在基类shape当中把draw设置为虚函数,我们只要直接在主函数当中直接声明子类的对象,调用draw,这种情况下是符合多态的思想的,

    void main()
    {
      round r;
      r.draw();
    }
    这就有疑问了,为什么还需要virtual关键字(虚函数)的存在呢?

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

    唯一的好处:简化使用方法。无论在哪里调用,或者传递参数,永远使用那个基类指针就可以了。它可以自动调用子类的相关函数。

  • 相关阅读:
    List Available DBCC Commands
    DBCC
    Oracle Shared Pool机制之——Latches, Locks, Pins and Mutexes
    新春寄语——令人期待的2018
    Oracle Shared Pool之Library Cache
    Linux NTP服务配置 for Oracle RAC
    Oracle 12c启动时PDBs的自动打开
    Oracle RAC时间同步(NTP/CTSS)
    Oracle 11g后台进程一览表
    Selenium WebDriver-通过断言页面是否存在某些关键字来确定页面按照预期加载
  • 原文地址:https://www.cnblogs.com/findumars/p/3070186.html
Copyright © 2011-2022 走看看