条款36:绝对重新定义继承而来的non-virtual函数
条款37:绝不重新定义继承而来的缺省参数
这两个条款说的绝不没有说不可以,意思是最好是这么做。个人觉得这两个条款没有太多可说的。
这里讲下缺省参数的问题。
在C++面向对象的技术中,virtual函数的类型是动态的,但是参数是静态的。具体可以参考《C++ primer》
以下的代码是糟糕的:
class Sharp
{
public:
enum SharpColor{Red,Green,Blue};
virtual void draw(SharpColor color = Red) const = 0;
.........
};
class Rect:public Sharp
{
public:
virtual void draw(SharpColor color = Red) const;
......
};
这里的默认参数即使相同,那也是不好的行为。
如果你觉得virtual表现出来的行为总是遇到麻烦,那么可以利用条款35的NVI手法:
class Sharp
{
public:
enum SharpColor{Red,Green,Blue};
void draw(SharpColor color = Red) const
{
doDraw(color);
}
.........
private:
virtual void doDraw(SharpColor color) const = 0;
};
class Rect:public Sharp
{
public:
....
private:
virtual void doDraw(SharpColor color) const;
......
};