Effective C++ Item 37 绝不又一次定义继承而来的缺省參数值「建议收藏」

Effective C++ Item 37 绝不又一次定义继承而来的缺省參数值

大家好,又见面了,我是全栈君。

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie

经验:绝对不要又一次而来的缺省參数值。由于缺省參数值都是静态绑定,而 virtual 函数 — 你唯一应该覆写的东西 — 却是动态绑定

演示样例:

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;
	//以对象调用此函数。一定要指定參数值
	//以指针(reference)调用此函数,能够不指定參数值,从base 继承缺省參数值
};
//下面三个变量的静态类型都是 Shape *
Shape *ps;
Shape *pc = new Circle;
Shape *pr = new Rectangle;

pr->draw(); 

解析:

因为pr是 Shape *,所以默认參数是Shape::Red。因为pr 指向 Rectangle,所以调用的是 Rectangle::draw

这里尽管是C++的内容,只是能够參考 《Python 源代码剖析》 一书,Python里默认參数是在编译时放在一个静态对象PyCodeObject里的

纠正:採用 virtual 函数的替代设计。如 NVI :令 base class 内的一个 public non-virtual 函数调用  private virtual 函数

class Shape{
public:
	enum ShapeColor {Red, Green, 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 draw(ShapeColor color) const; // 赋予不同缺省參数值
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115388.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • applicationContext.xml详解

    applicationContext.xml详解applicationContext.xml<beansxmlns=”http://www.springframework.org/schema/beans”xmlns:context=”http://www.springframework.org/schema/context”xmlns:aop=”http://www.springframework.org/schema/aop”xmlns:tx=”http://www.springframewo

    2022年7月13日
  • python中的缩进快捷键_取消首行缩进快捷键

    python中的缩进快捷键_取消首行缩进快捷键文章目录前言注意:IDLE开发环境对缩进量的设置前言和其它程序设计语言(如Java、C语言)采用大括号“{}”分隔代码块不同,Python采用代码缩进和冒号(:)来区分代码块之间的层次。在Python中,对于类定义、函数定义、流程控制语句、异常处理语句等,行尾的冒号和下一行的缩进,表示下一个代码块的开始,而缩进的结束则表示此代码块的结束。注意:Python中实现对代码的缩进,可以使用空格或者Tab键实现。但无论是手动敲空格,还是使用Tab键,通常情况下都是采用4个空

    2022年10月13日
  • Python环境配置及项目建立

    Python环境配置及项目建立一、安装PythonPython比较稳定的两个版本是Python3.5和Python2.7,我用的是Python2.7,下载地址是:https://www.python.org/downloa

    2022年7月5日
  • stm32f103c8t6电压采集adc_ADC电压采样显示

    stm32f103c8t6电压采集adc_ADC电压采样显示STM32F103+ADC采集实时电压+LCD1602A显示前言代码前言刚开始学习STM32,用的是开发板是野火的指南者,这款板子网上资源很多。在学习ADC和LCD部分时,想利用手头仅有的LCD1602A进行显示电压,经过不断调试后,就有如下代码。代码main.c//Anhighlightedblockvarfoo=’bar’;…

    2022年9月22日
  • mysql获取当前时间+1天_mysql获取当前时间,前一天,后一天[通俗易懂]

    mysql获取当前时间+1天_mysql获取当前时间,前一天,后一天[通俗易懂]负责的项目中,使用的是mysql数据库,页面上要显示当天所注册人数的数量,获取当前的年月日,我使用的是CURDATE(),错误的sql语句eg:SELECTCOUNT(*)FROMUSERWHEREregisterDate>=CURDATE()ANDregisterDate<CURDATE()+1;虽然获取到的数量在测试环境中是正确的,但在发布到线上的时候,发…

    2022年10月5日
  • 用JavaScript制作页面特效

    用JavaScript制作页面特效1.Window对象名称history:有关客户访问过的URL的信息location:有关当前URL的信息screen:有关客户端的屏幕和显示性能的信息常用方法prompt():弹出输入框

    2022年7月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号