绝不重新定义继承而来的缺省参数值

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 colo) const {}// 请注意,以上这么写则当客户以对象调用此函数,一定要指定参数值,因为静态绑定下这个函数并不从其basee继承缺省值。// 但是若以指针或者引用调用其函数,可以不指定参数值,因为动态帮顶下这个函数会从其base继承缺省参数。
}

现在考虑这些指针:

Shape* ps; // 静态类型为Shape*,动态类型为null,因为没有指向任何类型
Shape* pc = new Circle; // 静态类型为Shape*,动态类型为Circle*
Shape* pr = new Rectangle; // 静态类型为Shape*,动态类型为Rectangle*

静态类型是变量的声明类型,动态类型是实际指向的类型。静态类型不可改变,动态类型可以改变。

对于如下调用:pr->draw();Rectangle::draw函数的缺省参数应该是GREEN,但是pr的静态类型为Shape*,所以此调用的缺省参数值来自Shape class而非Retangle class!结局是Shape Class和Retangle Class的draw声明各出一半力。

请记住:

绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定,而virtual函数–你唯一应该覆写的东西–确实动态绑定。

37. Never redefine a function's iherited default parameter value.相关推荐

  1. pycharm报黄提示(黄色高亮警告):non-default parameter follows default parameter(定义时将没有默认值的参数放到了有默认值参数的后面)

    今天看QWidget源码的时候,看见里面有个参数被pycharm用红色波浪线标注,鼠标移动到上面,显示: non-default parameter follows default parameter ...

  2. java default parameter_JAVA菜鸟入门(7) default parameter , float/double vs BigDecimal

    1  java的允许函数的默认参数吗? java不支持类似C++那样,为函数设定默认参数,所以需要做的事情是,自己用函数重载的方式进行模拟.如下 public class FFOverload { p ...

  3. C++进阶_Effective_C++第三版(六) 继承与面向对象设计 Inheritance and Object-Oriented Design

    继承与面向对象设计 Inheritance and Object-Oriented Design 面向对象编程已经风靡编程界,关于继承.派生.virtual函数等等需要深入了解. 32.确定你的pub ...

  4. Effective C++ 中文版(第三版)读书笔记 更新ing~

    Effective C++ 中文版(第三版)持续更新ing 让自己习惯C++ 条款1 视c++为一个联邦 条款2 尽量以const,enum,inline替换#define 条款3 尽可能使用cons ...

  5. (6)继承与面向对象设计- Effective C++改善程序与设计的55个具体做法(Effective C++: 55 Specific Ways to Improve Your Programs)

    文章目录 32. 确定你的public继承塑模出is-a关系(Make sure public inheritance models "is-a") 33. 避免遮挡继承而来的名称 ...

  6. Effective C++改善程序与设计的55个具体做法笔记

    Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...

  7. 《Effective C++》》阅读笔记

    第一章    Accustoming Yourself to C++ 1           View C++ as a federation of language (1).             ...

  8. Effective C++ 改善55个方法

    美·Scott Meyers 候捷 电子工业 2011 刚才看到个会议时间有点晚,3.25论文都提交了 谷歌去广告的插件, 最后投了这个会议,刚刚好正合适.我说金钱与时间 ACCUSTOMING YO ...

  9. SQL Server内联表值函数

    In this article series, we will find basics and common usage scenarios about the inline table-valued ...

  10. 一天搞定DXUT三步曲之一:DXUT框架

    当初学GL的时候, 一直想写那个HDR的SHADER程序,苦于没有框架,再加上GL的例子太少,最后果断踏上了DX这条不归路.花了一天时间(准确的说是第一天的上午和第二天的下午)把DXUT的框架学习了, ...

最新文章

  1. 笔记-项目范围管理-复习要点
  2. Python的类Class中__init__函数和self
  3. [linx] ubuntu网络重启命令
  4. pentaho DI--- Tutorial (spoon)
  5. 我画了35张图,就是为了让你深入 AQS!
  6. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。
  7. 电商海报怎么设计,先告诉复古海报要设计要点(附模板)
  8. Linux学习笔记015---Centos关机命令
  9. VMware中linux访问共享文件夹设置流程
  10. python集合_Python集
  11. 区块链 以太坊 solidity 事务控制和异常处理 require assert
  12. D-Bus 性能分析
  13. chrome Axure插件(Mac版)
  14. 基于matlab的基带gmsk调制解调,基于MATLAB的GMSK调制解调实验
  15. [云原生专题-34]:K8S - 核心概念 - 网络 - Web服务器与反向代理服务器nginx入门介绍
  16. CSS | 如何达到监听页面滚动的效果?
  17. 基于COLA架构创建运输微服务应用和DDD领域建模
  18. [渝粤教育] 天水师范学院 无机及分析化学 参考 资料
  19. 微信公众号开启开发者模式
  20. BUUCTF reverse题目 内涵的软件

热门文章

  1. 第1章 异常产生异常处理
  2. 数据分析展现工具SmartBI
  3. CentOS下Vim编辑器的使用
  4. amp;#9733;一名“标题党”自我修炼的10…
  5. 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂
  6. Unity3D 游戏开发构架篇 ——输入控制
  7. [经验]自定义ASP.NET服务器控件属性的状态不能保存的问题
  8. 10. SQL 注入
  9. java 反射 获取Class对象的三种方式
  10. 05月08日 学习列表