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

文章目录

  • 绝不重新定义继承而来的缺省值参数
    • 一、问题引入
    • 二、结论

一、问题引入

  • 在C++中,只能继承两种函数:虚(virtual)函数和非虚(non-virtual)函数。
  • 而重新定义一个继承而来的带有缺省参数值的虚(virtual)函数永远是错误的
  • 虚(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;...
};

以上代码有个问题,如果你用下面的调用方式:

Shape *ps;
Shape *pc = new Circle;
Shape *pr = new Rectangle;pc->draw(Shape::Red);    //Circle::draw(Shape::Red);
pr->draw(Shape::Red);    //Rectangle::draw(Shape::Red);pr->draw();          //Rectangle::(Shape::Red)!!!!
  • 我们会发现,pr的动态类型是Rectangle*, 所以调用的是Rectangle的virtual函数,Rectangle::draw的缺省参数应该是GREEN
  • 但是,由于pr的静态类型是Shape*,所以此调用的缺省参数值来自Shape而不是Rectangle。
  • C++之所以这么做,是考虑到运行时效率的问题。如果缺省参数值是动态绑定,编译器就必须在运行期为虚函数决定适当的缺省值。这比目前实行的“在编译器决定”机制更慢更复杂。

二、结论

  • 绝对不要重新定义一个继承而来的缺省参数值,这些参数值都是静态的,而虚函数却是动态的
#include <iostream>
using namespace std;      class A
{      public:      virtual void Print(int a = 999)      {      cout<<a<<endl;      }
};      class B : public A
{      public:      virtual void Print(int a = 666)      {      cout<<a<<endl;      }
};      void Test(A& a)
{      a.Print();
}      int main()
{      B b;                                                                                                                                    Test(b);      return 0;
}
  • 这段代码的输出结果是999而非666,也就充分验证我们的结论

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

  1. C++:47---绝不重新定义继承而来的缺省参数值

    一.静态类型.动态类型 静态类型:在被声明时所采用的的类型 动态类型:目前所知对象的类型 演示案例 下面是一个继承体系 class Shape {public:enum ShapeColor { Re ...

  2. Effective C++:条款37:绝不又一次定义继承而来的缺省參数值

    因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...

  3. 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename...

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  4. SAP MM初阶创建服务采购订单时订购单位和物料组的缺省值

    SAP MM初阶创建服务采购订单时订购单位和物料组的缺省值 执行事务代码ME21N 创建采购订单,输入了单据类型,供应商,组织结构相关的数据,账户分配类别指定为K.如下图, 当把item catego ...

  5. 定义进项税代码缺省值

    一.说明 本文是在SAP系统后台,维护指定公司代码的进项税缺省值,以便于在采购业务的发票校验操作中能够快速地指定税码.此项配置主要与发票校验有关(TCODE:MIRO). 此项配置有先决条件,公司代码 ...

  6. python类继承返回值_python继承threading.Thread实现有返回值的子类实例

    继承与threading.thread实现有返回值的子类mythread,废话不多说,大家直接看代码 import threading class mythread(threading.thread) ...

  7. 14 PP配置-生产主数据-BOM相关-定义项目状态的缺省值

    业务背景:定义项目状态的缺省值 事务码:OS21 SPRO路径:SPRO->生产->基本数据->物料清单->常规数据->BOM 用途->定义项目状态的缺省值 第1步 ...

  8. 59 MM配置-后勤发票校验-维护税代码缺省值

    业务背景:维护税代码缺省值 事务码:SPRO SPRO路径:物料管理->后勤发票校验->收入发票->维护税代码缺省值 第1步,SPRO进入 第2步,设置默认的税码 配置完成! 202 ...

  9. 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)...

    1 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) 2 [功能]根据条件返回相应值 3 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或 ...

最新文章

  1. 一位读者刚刚收割阿里、腾讯等大厂Offer,他说这些话一定要和你们说一下
  2. centos安装php7编译
  3. linux使用find命令_如何在Linux中使用FIND
  4. svg放大缩小拖动_Day2 三种图表技术SVG、Canvas、WebGL 3D比较
  5. 解决 Failed to connect to github.com port 443:connection timed out
  6. AI 用神经网络实现序列到序列的学习
  7. Hilbert变换C语言实现学习
  8. mysql唯一索引和聚合索引区别_唯一索引、聚集索引和聚集索引
  9. 坚果云下载的文件夹在哪_文件管理软件Zotero+坚果云配置之小白教程,与大家交流...
  10. CTCconnectionist temporal classfication: labelling unsegmented sequence data with recurrent(一)
  11. Python淘宝爬虫
  12. im即时通讯开发:万人群聊技术方案实践
  13. android 吉他模拟器,真实吉他模拟器怎么玩 新手玩法攻略详解
  14. 软件完整开发过程,以及项目的部署(精简)
  15. 壹沓科技签约七匹狼,助力「中国男装领导者」数字化转型
  16. APP性能测试关注点详细介绍
  17. A4纸的像素和分辨率
  18. 工件表面图案正反及混料检测流程
  19. python海龟库写名字
  20. 【福利季】《手机历史漫谈》

热门文章

  1. python知识点汇总百度文库_PYTHON知识点汇总.doc
  2. 【SpringBoot零基础案例01】【IEDA 2021.1】如何创建一个SpringBoot框架web项目
  3. 关于使用fastjson统一序列化响应格式。
  4. mysql怎样查询表的信息!
  5. 合作伙伴:VMware收购Wavefront提供强大的多云应用管理渠道
  6. vue computed 使用小问题
  7. 老男孩教育参观云计算公司
  8. spring MVC 工作原理
  9. sp_updatestats和update statistics的区别
  10. CodeForces - 1316D Nash Matrix(构造+dfs)