缺省参数是编译期间绑定的,而不是动态绑定

看一个程序

#include <iostream>
using namespace std;

class A
{
public:
	virtual void Fun(int number = 10)
	{
		std::cout << "A::Fun with number " << number<<endl;
	}
};

class B: public A
{
public:
	virtual void Fun(int number = 20)
	{
		std::cout << "B::Fun with number " << number<<endl;
	}
};

int main()
{
	B b;
	A &a = b;
	a.Fun();
	return 0;
}                 //虚函数动态绑定=>B,非A,缺省实参是编译时候确定的=>10,非20 

 输出:B::Fun with number 10 条款38:   决不要重新定义继承而来的缺省参数值  本条款的理由就变得非常明显:虚函数是动态绑定而缺省参数值是静态绑定的。 这意味着你最终可能调用的是一个定义在派生类,但使用了基类中的缺省参数值的虚函数.  为什么C++坚持这种有违常规的做法呢?答案和运行效率有关。如果缺省参数值被动态绑定,编译器就必须想办法为虚函数在运行时确定合适的缺省值,这将比现在采用的在编译阶段确定缺省值的机制更慢更复杂。做出这种选择是想求得速度上的提高和实现上的简便,所以大家现在才能感受得到程序运行的高效;当然,如果忽视了本条款的建议,就会带来混乱。

转载:http://blog.csdn.net/coolingcoding/article/details/8045978

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏精讲JAVA

用 Maven 实现一个 protobuf 的 Java 例子

Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化,常用于RPC 系统(Remote Procedure...

1272
来自专栏贾老师の博客

Lock-Free 学习总结

在通常使用 Mutex 互斥锁的场景, 有的线程抢占了锁, 其他线程则会被阻塞, 当获得锁的进程挂掉之后, 整个程序就 block 住了. 但在 Lock-Fr...

5833
来自专栏乐百川的学习频道

设计模式(二十四) 访问者模式

访问者模式提供了一种方法,将算法和数据结构分离。假设我们需要对一个数据结构进行不同的操作,就可以考虑使用访问者模式。访问者模式的要点在于,需要一个访问者接口,提...

2246
来自专栏资深Tester

测试流程之如何设计测试用例

1983
来自专栏海天一树

NOIP 2010普及组初赛C/C++答案详解

1 D 2E + 03 = 2 * 103 = 2000 2E - 03 = 2 * 1 / (2 * 103) = 2 * 0.001 = 0.002

831
来自专栏C语言及其他语言

训练场题库中判题结果的详细解释

对于判题结果仅仅是大致的解释,仍不少同学感到迷惑,那今天我们就对这些结果一一详细解释并举例说明,让大家彻底觉悟! 等待 等待服务器正忙,请稍后查看运行并评判您的...

3255
来自专栏铭毅天下

干货 | Elasticsearch Nested类型深入详解

本文通过一个例子将Nested类型适合解决的问题、应用场景、使用方法串起来, 文中所有的DSL都在Elasticsearch6.X+验证通过。

2263
来自专栏有趣的django

PYTHON面试

大部分的面试问题,有最近要找事的老铁吗?  python语法以及其他基础部分 可变与不可变类型;  浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来...

6487
来自专栏海纳周报

用Atomic实现锁

一直想写ReentrantLock,就得先介绍AbstractQueueSynchronizer,可是我觉得这样写,不过瘾,我把代码贴一遍,懂的人自己就能找到这...

3616
来自专栏编程

改进异常处理的 6 条建议

来源:ImportNew - 唐尤华 , 合理地使用异常处理可以帮你节省数小时(甚至数天)调试时间。一个乘法异常会毁掉你的晚餐乃至周末计划。如果处置不及时,甚至...

2379

扫码关注云+社区

领取腾讯云代金券