绝不重新定义继承而来的缺省值参数
绝不重新定义继承而来的缺省值参数
文章目录
- 绝不重新定义继承而来的缺省值参数
- 一、问题引入
- 二、结论
一、问题引入
- 在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,也就充分验证我们的结论
绝不重新定义继承而来的缺省值参数相关推荐
- C++:47---绝不重新定义继承而来的缺省参数值
一.静态类型.动态类型 静态类型:在被声明时所采用的的类型 动态类型:目前所知对象的类型 演示案例 下面是一个继承体系 class Shape {public:enum ShapeColor { Re ...
- Effective C++:条款37:绝不又一次定义继承而来的缺省參数值
因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...
- 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename...
一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...
- SAP MM初阶创建服务采购订单时订购单位和物料组的缺省值
SAP MM初阶创建服务采购订单时订购单位和物料组的缺省值 执行事务代码ME21N 创建采购订单,输入了单据类型,供应商,组织结构相关的数据,账户分配类别指定为K.如下图, 当把item catego ...
- 定义进项税代码缺省值
一.说明 本文是在SAP系统后台,维护指定公司代码的进项税缺省值,以便于在采购业务的发票校验操作中能够快速地指定税码.此项配置主要与发票校验有关(TCODE:MIRO). 此项配置有先决条件,公司代码 ...
- python类继承返回值_python继承threading.Thread实现有返回值的子类实例
继承与threading.thread实现有返回值的子类mythread,废话不多说,大家直接看代码 import threading class mythread(threading.thread) ...
- 14 PP配置-生产主数据-BOM相关-定义项目状态的缺省值
业务背景:定义项目状态的缺省值 事务码:OS21 SPRO路径:SPRO->生产->基本数据->物料清单->常规数据->BOM 用途->定义项目状态的缺省值 第1步 ...
- 59 MM配置-后勤发票校验-维护税代码缺省值
业务背景:维护税代码缺省值 事务码:SPRO SPRO路径:物料管理->后勤发票校验->收入发票->维护税代码缺省值 第1步,SPRO进入 第2步,设置默认的税码 配置完成! 202 ...
- 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)...
1 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) 2 [功能]根据条件返回相应值 3 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或 ...
最新文章
- 一位读者刚刚收割阿里、腾讯等大厂Offer,他说这些话一定要和你们说一下
- centos安装php7编译
- linux使用find命令_如何在Linux中使用FIND
- svg放大缩小拖动_Day2 三种图表技术SVG、Canvas、WebGL 3D比较
- 解决 Failed to connect to github.com port 443:connection timed out
- AI 用神经网络实现序列到序列的学习
- Hilbert变换C语言实现学习
- mysql唯一索引和聚合索引区别_唯一索引、聚集索引和聚集索引
- 坚果云下载的文件夹在哪_文件管理软件Zotero+坚果云配置之小白教程,与大家交流...
- CTCconnectionist temporal classfication: labelling unsegmented sequence data with recurrent(一)
- Python淘宝爬虫
- im即时通讯开发:万人群聊技术方案实践
- android 吉他模拟器,真实吉他模拟器怎么玩 新手玩法攻略详解
- 软件完整开发过程,以及项目的部署(精简)
- 壹沓科技签约七匹狼,助力「中国男装领导者」数字化转型
- APP性能测试关注点详细介绍
- A4纸的像素和分辨率
- 工件表面图案正反及混料检测流程
- python海龟库写名字
- 【福利季】《手机历史漫谈》
热门文章
- python知识点汇总百度文库_PYTHON知识点汇总.doc
- 【SpringBoot零基础案例01】【IEDA 2021.1】如何创建一个SpringBoot框架web项目
- 关于使用fastjson统一序列化响应格式。
- mysql怎样查询表的信息!
- 合作伙伴:VMware收购Wavefront提供强大的多云应用管理渠道
- vue computed 使用小问题
- 老男孩教育参观云计算公司
- spring MVC 工作原理
- sp_updatestats和update statistics的区别
- CodeForces - 1316D Nash Matrix(构造+dfs)