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)
上一篇 2022年2月5日 上午8:00
下一篇 2022年2月5日 上午8:00


相关推荐

  • BitBlt用法_BIT函数

    BitBlt用法_BIT函数BitBlt用法在VC中显示位图常用取BitBlt()方法,它是将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容。今天要将一些位图显示到窗口中,所以学习了一下。我已经将要用的位图导入到工程资源中,

    2022年10月19日
    4
  • Bootstrap 之Table样式[通俗易懂]

    Bootstrap 之Table样式[通俗易懂]将标签添加class=‘table’类后的样式Table样式编号姓名年龄001郭靖25002黄蓉23003杨过24我们可以看到,Tabl

    2026年2月1日
    6
  • threadlocal详解_thread local

    threadlocal详解_thread localC#中,Thread类有一个IsBackground的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程。个人感觉这样的解释等于没有解释..Net中的线程,可以分为后台线程和前台线程。后台线程与前台线程并没有本质的区别,它们之间唯一的区别就是:后台线程不会防止应用程序的进程被终止掉。呵呵,这句话读出来好像并不那么好懂.其实,说白了就是当前台线程都结束了的时候,整个…

    2022年10月17日
    7
  • 说明子网和子网掩码的概念_子网与子网掩码

    说明子网和子网掩码的概念_子网与子网掩码子网掩码与子网划分 目录: 一、摘要 二、子网掩码的概念及作用 三、为什么需要使用子网掩码 四、如何用子网掩码得到网络/主机地址 五、子网掩码的分类 六、子网编址技术 七、如何划分子网及确定子网掩码 八、相关判断方法 一、摘要 近期在我的论坛中大家对子网掩码以及子网划分的讨论比较多,因为前面也写了关于ip地址的教程,为了延续性,就写了这个关于子网掩码与子网划分的教程,学这篇教…

    2025年7月21日
    3
  • AE图床-图床聚合源码

    AE图床-图床聚合源码介绍:一个图床聚合程序,自带鉴黄功能,违规图片智能拦截可以直接复制上传以后的链接以及预览支持5个接口上传,图片都支持https永久免费图床,无需注册,批量上传,即时预览,无限流量,无限外链,永久保存,微博服务器,全网CDN,高速稳定,网页上传,无需插件。支持JPG,GIF,PNG等文件格式。支持远程图片上传。微博图床,围脖是个好图床。网盘下载地址:https://zijiewangpan.com/cH4upvpuqQw图片:…

    2022年5月8日
    46
  • SpringBoot文件上传下载和多文件上传(图文详解)

    SpringBoot文件上传下载和多文件上传(图文详解)最近在学习SpringBoot,以下是最近学习整理的实现文件上传下载的java代码:1、开发环境:IDEA15+Maven+JDK1.82、新建一个maven工程:3、工程框架4、pom.xml文件依赖项

    2022年6月12日
    51

发表回复

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

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