如果类继承中重新定义了虚函数,那么虚函数中的缺省参数不要重新定义。
用一句话来解释原因就是:虚函数是动态绑定的(dynamically bound),但是缺省参数却是静态绑定的(statically bound)。
静态类型和动态类型
首先需要了解什么是对象的静态类型和动态类型,对象的所谓静态类型(static type),就是它在程序中被声明时所采用的类型。
以下面的类为例:
class Shape
{
public:
enum ShapeColor{Red,Green,Blue};
virtual void draw(ShapeColor color=Red) const =0;
};
class Rectangle :public Shape
{
public:
virtual void draw(ShapeColor color=Green) const;
};
class Circle:public Shape
{
public:
//当以对象调用这个函数时,一定要指定参数值。
//因为静态绑定下这个函数并不从其base继承缺省的参数值
//但若以指针或引用调用此函数,可以不指定参数值,
//因为动态绑定下这个函数会从其base继承缺省参数值
virtual void draw(ShapeColor) const;
};
考虑下面这些指针:
Shape *ps;//静态类型是Shape*
Shape *pc=new Circle;//静态类型是Shape*
Shape *pr=new Rectangle;//静态类型是Shape*
ps,pc,pr都被声明为point to Shape类型,所以他们都以它为静态类型。
对象的所谓动态类型(dynamic type)则是指它“目前所指向对象的类型”。也就是说,动态类型可以表现出一个对象将会有什么行为。以上例,pc的动态类型是Circle *,pr的动态类型是Rectangle *。ps没有动态类型,因为它尚未指向任何对象。
动态类型和它的名字所示,可以在程序执行过程中改变(通过赋值操作符)
pc=pr;//这条语句把pc的动态类型由Circle*改成了Rectangle*
个人感觉C++中的静态类型和动态类型和C中指针的类型(静态类型)