• 缺省参数值的继承问题


      在C++的继承中,缺省参数会出现在两种函数:virtual和non-virtual函数。

      先讨论non-virtual函数继承。如果在子类内再次定义父类的non-virtual函数,这时会覆盖父类的同名函数,就是我们所谓的重写override。也就是一个全新的函数,和父类完全没有关系,使用的缺省参数当然是子类的。

      再看virtual函数继承。假设有如下的继承关系:

    class Shape
    {
    public:
        virtual void draw(int nColor = 255) const = 0;
    };
    
    class Rect : public Shape
    {
    public:
        void draw(int nColor = 120) const
        {
            cout<<nColor<<endl;
        }
    };
    
    int main()
    {
        Shape* ps = new Rect;
        ps->draw();
        return 0;
    }

      这种情况下draw函数输出的是255还是120?答案是255。

      如果把main函数中的代码改一下:

    1 int main()
    2 {
    3     Rect* ps = new Rect;
    4     ps->draw();
    5     return 0;
    6 }

      那这种情况下draw函数输出的是255还是120?答案是120。

      这是为什么呢?原因其实是由C++的动态绑定和静态绑定机制决定的。我们首先要知道virtual是动态绑定,而缺省参数值却是静态绑定的。也就是说函数使用哪个缺省参数在编译器就已经决定好了。就好比说上面的第一种情况,ps的静态类型是Shape*,也就是ps在调用draw函数时使用的是Shape::draw函数的缺省参数255。同理第二种情况使用的是Rect::draw的缺省参数120。

  • 相关阅读:
    MS SQL2000 && 2005转出数据字典
    基于角色的访问控制'的权限管理的数据库的设计实现
    ANSI SQL / T SQL / PLSQL
    MS SQL系統資料表內容
    关闭不需要服务 为Windows系统提速
    Form.Enctype屬性
    流程圖
    ASPSmartUpload祥解
    数据排序常见算法(JS版)
    如何实现定时开机
  • 原文地址:https://www.cnblogs.com/wuhaowinner/p/default_parameter.html
Copyright © 2020-2023  润新知