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