zoukankan      html  css  js  c++  java
  • [转载]虚函数与默认实参

    本文转载于http://blog.csdn.net/chenyiming_1990/article/details/8981868

    新加内容提醒:

    关于利用virtual函数实现动态绑定/多态,需要尤其注意的一点是:

        必须保证基类和派生类中对应的虚函数除了函数名称一致之外,还必须保证形参和返回值也完全一致!

        若基类和派生类中仅仅是虚函数的函数名称一致,但是形参不一致,则无法实现动态绑定/多态!实际上造成的结果是:派生类中对基类中对应的函数进行了隐藏,在派生类中只能访问派生类中的该函数,在基类中只能访问基类中对应的同名函数。

    针对基类和派生类中的虚函数有没有默认实参问题进行讨论。

    1.基类虚函数不带参数,派生类带参数

    #include<iostream>
    using namespace std;  
    class super  
    { 
    public: 
    virtual void somemethod()const { cout<<"base" << endl; } 
    }; 
    class sub : public super  
    { 
    public: 
    virtual void somemethod(int i = 12)const { cout<<"sub" << "i = " << i <<endl; } 
    }; 
    int main(void) 
    { 
            sub mysub; 
            super &ref = mysub; 
            ref.somemethod();    // 调用哪个?
    return 0; 
    } 
    

      

     

    输出:base

    调用的是基类的,派生类是基类这个函数的重新定义的版本,无法实现动态绑定/多态。(这个务必引起重视,因为形参已经不一样了)

    2.基类虚函数不带参数,派生类带参数

    [cpp] view plaincopyprint?
    
    #include<iostream>
    using namespace std;  
    class super  
    { 
    public: 
    virtual void somemethod(int i = 21)const {cout<<"base"<<"i = "<< i <<endl;} 
    }; 
    class sub : public super  
    { 
    public: 
    virtual void somemethod()const { cout<<"sub" << "i = " << i <<endl; } 
    }; 
    int main(void) 
    { 
            sub mysub; 
            super &ref = mysub; 
            ref.somemethod();    // 调用哪个?
    return 0; 
    } 
    

      

     

    输出:

    Base i = 21

    原因和上面的一样。调用的是基类的,派生类是基类这个函数的重新定义的版本,无法实现动态绑定/多态。(这个务必引起重视,因为形参已经不一样了)

    3.基类虚函数带参数,派生类带参数,且默认实参是一样的。

    #include<iostream>
    using namespace std;  
    class super  
    { 
    public: 
    virtual void somemethod(int i = 12)const {cout<<"base "<<"i = "<< i <<endl;} 
    }; 
    class sub : public super  
    { 
    public: 
    virtual void somemethod(int i = 12)const {cout<<"sub "<<"i = "<< i <<endl;} 
    } 
    int main(void) 
    { 
            sub mysub; 
            super &ref = mysub; 
            ref.somemethod();    // 调用哪个?
    return 0; 
    } 
    

      

     

    输出:sub i = 12

    4.基类虚函数带参数,派生类带参数,且默认实参不一样的。

    #include<iostream>
    using namespace std;  
    class super  
    { 
    public: 
    virtual void somemethod(int i = 12)const {cout<<"base "<<"i = "<< i <<endl;} 
    }; 
    class sub : public super  
    { 
    public: 
    virtual void somemethod(int i = 21)const { cout<<"sub " << "i = " << i <<endl;} 
    }; 
    int main(void) 
    { 
            sub mysub; 
            super &ref = mysub; 
            ref.somemethod();    // 调用哪个?
    return 0; 
    } 
    

      

     

    输出:sub i = 12

    原因:你会发现虽然调用的是派生类的函数,但是实参确实基类的。这就是比较变态的地方。

  • 相关阅读:
    解决VS打开文件出现No EditorOptionDefinition export found for the given option name问题
    git SourceTree 客户端 安装/使用教程
    C#调用WebService实例和开发
    Web Service 和WCF的比较
    Web Service 消息格式
    C#如何使用REST接口读写数据
    解决EasyNVR现场无固定公网IP的问题,万千企业期待的EasyNVS管理平台是什么?
    借助EasyNTS云组网,无需拉专线,也能解决设备现场无公网固定IP的问题
    EasyPlayer-RTSP-Android安卓播放器播放RTSP延迟优化策略,极低延时!
    EasyNVR现场部署搭配EasyNVS云端集中控制应用于幼儿园直播场景的最佳方案!
  • 原文地址:https://www.cnblogs.com/jiayouwyhit/p/3307618.html
Copyright © 2011-2022 走看看