• 虚函数的作用


    可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时, 
    基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数, 
    而不是基类中定义的成员函数(只要派生类改写了该成员函数)。 
    若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都 
    会调用基类中定义的那个函数。

    程序1:

    #i nclude <iostream>
    using namecpace std;
    class B0 //基类B0声明
    { public:
     void display(){cout<<"B0::display()"<<endl;} //公有成员函数
    };
    class B1: public B0 
    {
     public:
     void display(){cout<<"B1::display()"<<endl;} 
    };
    class D1: public B1 
    {
    public:
     void display(){cout<<"D1::display()"<<endl;} 
    };
    void fun(B0 *ptr) 
    { ptr->display(); //"对象指针->成员名"  }
    void main() //主函数
    { B0 b0; //声明B0类对象
     B1 b1; //声明B1类对象
     D1 d1; //声明D1类对象
     B0 *p; //声明B0类指针
     p=&b0; //B0类指针指向B0类对象
     fun(p);
     p=&b1; //B0类指针指向B1类对象
     fun(p);
     p=&d1; //B0类指针指向D1类对象
     fun(p);
    }
    运行结果:
    B0::display()
    B0::display()
    B0::display()

    程序2:
    #i nclude <iostream>
    using namespace std;
    class B0 //基类B0声明
    {public: //外部接口
     virtual void display() //虚成员函数
         {cout<<"B0::display()"<<endl;} 
    };
    class B1: public B0 //公有派生
    { public:
           void display()  {  cout<<"B1::display()"<<endl;  }
    };
    class D1: public B1 //公有派生
    { public:
       void display() {  cout<<"D1::display()"<<endl;  }
    };
    void fun(B0 *ptr) //普通函数
    {    ptr->display();    }
    void main() //主函数
    { B0 b0,  *p; //声明基类对象和指针
     B1 b1; //声明派生类对象
     D1 d1; //声明派生类对象
     p=&b0;
     fun(p); //调用基类B0函数成员
     p=&b1;
     fun(p); //调用派生类B1函数成员
     p=&d1;
     fun(p); //调用派生类D1函数成员
    }
    运行结果:
    B0::display()
    B1::display()
    D1::display()

    虚函数是动态绑定的基础。
    是非静态的成员函数。
    在类的声明中,在函数原型之前写virtual。
    virtual 只用来说明类声明中的原型,不能用在函数实现时。
    具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。
    本质:不是重载声明而是覆盖。
    调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。

    http://www.cnblogs.com/kyleada/archive/2011/05/19/2051184.html

  • 相关阅读:
    请求分页中的内存分配
    Android开发实例总结
    出现java.lang.IllegalArgumentException异常
    请求分页中的内存分配之续
    HTTPCLIENT使用学习
    传输控制层协议TCP概述抄书
    freemarker中空值 null的处理 ?exists ?if_exists ?default(“”)
    Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring 大新博客 推酷 360安全浏览器 7.1
    jade 学习笔记 gulp 自动编译
    @resource和@autowired的区别是什么CSDN论坛CSDN.NET中国最大的IT技术社区 Google Chrome
  • 原文地址:https://www.cnblogs.com/sweeeper/p/4701713.html
Copyright © 2020-2023  润新知