导航

缺省参数值的继承问题

Posted on 2014-04-16 13:54  吴豪  阅读(583)  评论(0编辑  收藏  举报

  在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。