1.当重新定义继承而来的缺省参数值的时候。
C++为了提高效率:虚函数动态绑定,缺省参数值静态绑定。这样会造成调用一个派生类里面的虚函数的同时,会使用基类为它指定的缺省值。
代码如下:
```cpp
#include<iostream>
using namespace std;
class Shape
{
public :
enum shapeColor{Red,Green,Blue};
virtual void draw(shapeColor color = Red) const = 0
{
cout << "Shape::draw() " << "Red" << endl;
}
};
class Rectangle :public Shape
{
public :
virtual void draw(shapeColor color = Green) const
{
cout << "Ractangle::draw() " << color << endl;
}
};
class Circle :public Shape
{
public :
virtual void draw(shapeColor color) const
{
cout << "Circle::draw() " << color << endl;
}
};
int main()
{
Shape* ps;
Shape* pr = new Rectangle();
Shape* pc = new Circle();
pr->draw();
pc->draw();
return 0;
}
怎样能够解决这个问题呢?可以使用NVI(no-virtual-interface)手法:令base class 内的一个 public no-virtual 函数调用private virtual 函数,后者可以被派生类重新定义。
代码如下:
#include<iostream>
using namespace std;
class Shape
{
public :
enum shapeColor {Red,Geen,Blue};
void draw(shapeColor color=Red) const
{
doDraw(color);
}
private:
virtual void doDraw(shapeColor color ) const = 0;
};
class Rectangle :public Shape
{
public :
private :
virtual void doDraw(shapeColor color) const;
};
void Rectangle::doDraw(shapeColor color) const
{
cout << "Rectangle::doDraw() " << color << endl;
}
class Circle :public Shape
{
public :
private :
virtual void doDraw(shapeColor color) const;
};
void Circle::doDraw(shapeColor color) const
{
cout << "Circle::doDraw() " << color << endl;
}
int main()
{
Shape* ps;
Shape* pr = new Rectangle();
Shape* pc = new Circle();
pc->draw(Shape::Blue);
pr->draw();
return 0;
}