先来看这样一段代码

class Base
{
public:
virtual void print(int a = 1) const
{
std::cout << "Base " << a << "\n";
}
}; class Derived : public Base
{
public:
virtual void print(int a = 2) const override
{
std::cout << "Derived " << a << "\n";
}
};

请问:若按如下方式调用,会输出什么?

Base *p = new Derived();
p->print();

答案:输出 Derived 1(而非 Base 1Derived 2)。

原因:

  • 虚函数动态绑定,在运行时根据对象的实际类型决定调用哪个函数,因此这里调用的函数为 Base::print
  • 默认实参静态绑定,在编译期根据指针的声明类型决定默认实参的值,因此这里的 p->print() 相当于 p->print(1)

因此,重写基类函数时不要重新定义函数的默认参数,以避免出现上文中的坑。

参考资料:

  1. Effective C++ item 37: Never Redefine a Function's Inherited Default Parameter Value
  2. 默认实参 - cppreference.com

C++默认参数静态绑定的更多相关文章

  1. python中的默认参数

    https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...

  2. python3 函数的形参、实参、位置参数、默认参数、关键字参数以及函数的递归

    python 版本 3.5 #Author by Andy#_*_ coding:utf-8 _*_def func(x,y=2): print('我是形参%s'%x) print('我是默认参y-- ...

  3. [c++]默认参数

     =================默认参数==================在函数声明时表明默认值,在函数定义时正常定义void function(int a = 2)// 函数声明void fu ...

  4. ES6函数默认参数(Default Parameters)

    语言更新时每一个新增的特性都是从千百万开发者需求里提取过来的,规范采用后能减少程序员的痛苦,带来便捷. 我们经常会这么写 function calc(x, y) { x = x || 0; y = y ...

  5. C++中函数的默认参数和C语言中volatile的学习

    1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

  6. 【matlab】设定函数默认参数

    C++/java/python系列的语言,函数可以有默认值,通常类似如下的形式: funtion_name (param1, param2=default_value, ...) 到了matlab下发 ...

  7. Delphi函数参数传递 默认参数(传值)、var(穿址)、out(输出)、const(常数)四类

    Delphi的参数可以分为:默认参数(传值).var(传址).out(输出).const(常数)四类 可以对比C/C++的相关知识,类比学习. 1.默认参数是传值,不会被改变,例子 function ...

  8. 我的c++学习(6)默认参数和内联函数

    默认参数 一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同.“默认参数”指在定义或声明函数时为形参指定默认 ...

  9. 海蜘蛛WiFiDog固件 MTK7620 OEM,带云AC功能、探针、广告插入,MTK7620解包打包维修默认参数

    修改内容: 1.系统默认管理员员帐号密码 2.系统默认LAN 接口地址 3.系统默认DHCP及保留地址 4.系统默认云AC远程地址及协议内容 5.系统默认JS插入地址 6.系统默认探针位置 7.默认顶 ...

随机推荐

  1. python运算符,内置函数简单使用

    1.编写程序,输入任意大的自然数,输出各位数字之和. 2.编写程序,输入两个集合 setA 和 setB,分别输出它们的交集.并集和差集 setA-setB. 3.编写程序,输入一个自然数,输出它的二 ...

  2. 基于mysql的sakila数据库脚本分析

    本例是基于mysql的sakila数据库脚本的复杂查询分析,大家可以去mysql官网上下载此脚本:也可以进入我的资源页进行下载: 关系图如下: 下面是查询的案例: 1.查询某部电影的所属类别,语言 S ...

  3. BeanUtils中的自动类型转换(二)

    javabean package entity; import java.util.Date; /** * 一个测试用: * student,javaBean * @author mzy * 一个标准 ...

  4. Spring Cloud总结

    restTemplate 消费者模块编写restTemplate配置类,即可在控制层调用提供者模块 // 配置类 @Configuration public class ApplicationCont ...

  5. Android Jetpack基本架构之ViewModel+LiveData+DataBinding入门

    前提:导入所有依赖,开启DataBinding app的build.gradle android { defaultConfig { ... dataBinding { enabled true } ...

  6. spring整合jdbc方法一

    用了一段时间的spring这,闲来没事做一下spring整合jdbc 目录文件 导入jar包 由于spring的jar包是在myeclipse中自动导入的有些暂时用不到的也没有处理. Emp类 pac ...

  7. Docker私有镜像仓库Harbor

    一.安装Harbor(离线安装包的方式安装) 1.解压离线包 2.进入harbor目录中编辑harbor.yml 3.安装docker-compose yum -y install docker-co ...

  8. Redis集群的搭建及与SpringBoot的整合

    1.概述 之前聊了Redis的哨兵模式,哨兵模式解决了读的并发问题,也解决了Master节点单点的问题. 但随着系统越来越庞大,缓存的数据越来越多,服务器的内存容量又成了问题,需要水平扩容,此时哨兵模 ...

  9. ARM架构安装ubuntu系统

    一.简介 arm开发板制作系统是比较麻烦,不论使用busybox还是yocto制作根文件系统对新手都比太友好,除非深度定制,否则使用ubuntu系统既可以满足,把更多的精力放在应用开发上. 二.准备材 ...

  10. wpf内存泄漏问题

    http://www.cnblogs.com/Cindys/archive/2012/05/17/2505893.html http://blogs.msdn.com/b/jgoldb/archive ...