《Effective C++》读书笔记之item37:绝不重新定义继承而来的缺省参数值

1.绝不重新定义继承而来的缺省参数值,它有两层意思:

  • (1)如果函数是非虚函数,你根本不应该重新定义它,因此也谈不上改变缺省参数值了。
  • (2)如果函数是虚函数,由于缺省参数值是“静态绑定”,即使使用基类类型的指针或引用指向派生类函数,并且函数以派生类所定义的版本动作,其缺少参数值仍旧是基类所定义的!C++使用这种方式是为了“运行期效率”,在编译期确定参数比在运行期确定效率要高。

2.如以下继承体系:

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:
		virtual void draw(ShapeColor color) const;	//静态绑定下这个函数不从基类继承缺省参数值,而在指针或引用指向时(动态绑定)会从基类函数继承缺省参数值
		...
};


改进方法:

  • (1)定义相同的缺省参数值。缺点:代码重复,同时依赖性高(如果基类的缺省参数值改变,必须同时改变派生类的相应参数值)。
  • (2)使用virtual函数替代方案(条款35)的NVI方法:定义公有的非虚函数,调用私有的虚函数,而该虚函数从非虚函数中接受参数来设定默认参数的值。这样只要修改仅有的非虚函数就可以改变默认参数了。派生类只改写虚函数的定义。

class Shape{
	public:
		enum ShapeColor { Red, Green, Blue };
		void draw(ShapeColor = Red) const{	//如果需要改变默认颜色,只需要修改此处
			doDraw(color);		//调用虚函数
		}
		...
	private:
		virtual void doDraw(ShapeColor color) const = 0;		//真正的工作在此处完成
};
class Rectangle : public Shape{
	public:
		...
	private:
		virtual void doDraw(ShapeColor color) const;		//不需要指定缺省参数值
		...
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值