绝不重新定义继承而来的缺省参数——effective c++学习笔记
来源:互联网 发布:mac 8080端口被占用 编辑:程序博客网 时间:2024/06/04 18:58
绝不重新定义继承而来的缺省参数(Never redefine function’s inherited default parameters value.)
讨论的前提是:不重新定义继承而来的no-virtual函数。所以,讨论的范围是:继承一个带有缺省参数值的virtual函数。
class B
{
virtual void fun(int i = 10) = 0;
}
class D : public B
{
virtual void fun(int i = 20);
}
class C : public B
{
virtual void fun(int i );
}
这里需要明确的概念:
1、 对象的静态类型:对象在声明时采用的类型。是在编译器确定的。
2、 对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。
3、 静态绑定:绑定的是对象的静态类型。某特性依赖于对象的静态类型。编译器绑定的。
4、 动态绑定:绑定的是对象的动态类型。某特性依赖于对象的动态类型。运行期决定的。
这样就有一个问题,缺省函数是静态绑定的,而virtual函数则是动态绑定。这样,如果子类重定义了继承而来的缺省参数,同时对象的静态类型和动态类型不一样,将会出现使用的子类的函数,同时使用的是基类的缺省参数。
B *pB = NULL;
D *pD = new D();
C *pC = new C();
pB = pD;
pB->fun();//调用的是D的fun函数,默认入参是B的默认入参:10
pB = pC;
pB->fun();//调用的是C的fun函数,默认入参是B的默认入参:10
pC->fun();//编译无法通过,必须要有参数。
c++这样来处理是为了效率的考量。
可以通过NVI(no-virtual interface)手法优化设计。
附:
1、 回到开头的前台,如果重新定义no-virtual函数的缺省参数,至少不会出现上面描述的诡异问题,因为他们都是静态绑定的。
2、 子类继承基类的virtual函数(有缺省参数),但是子类可以不指定缺省参数。
3、 对于virtual函数,如果要继承,千万不要忘掉virtual关键字。
- 绝不重新定义继承而来的缺省参数——effective c++学习笔记
- 《Effective C++》37: 绝不重新定义继承而来的缺省的参数值
- 《Effective C++》读书笔记之item37:绝不重新定义继承而来的缺省参数值
- Effective C++:条款37:绝不重新定义继承而来的缺省参数值
- 绝不要重新定义继承而来的缺省参数值(Effective C++_37)
- Effective C++:绝不重新定义继承而来的缺省参数值
- 读书笔记《Effective C++》条款37:绝不重新定义继承而来的缺省参数值
- C++之绝不重新定义继承而来的缺省参数值(37)---《Effective C++》
- 《Effective C++ 》学习笔记-第六章 条款37:绝不重新定义继承而来的缺省参数值
- Effective C++条款 37:绝不重新定义继承而来的缺省参数值
- Effective C++ Item 37 绝不重新定义继承而来的缺省参数值
- Effective C++ 读书笔记 条款37:绝不重新定义继承而来的缺省参数值
- effective C++中条款37:绝不重新定义继承而来的缺省参数值
- 绝不重新定义继承而来的缺省参数值--from Effective c++ item 37
- 绝不重新定义继承而来的缺省参数值
- 绝不重新定义继承而来的缺省参数值
- 绝不重新定义继承而来的缺省参数值
- effective C++笔记之条款38: 绝不要重新定义继承而来的缺省参数值
- 绝不重新定义继承而来的no-virtual函数——effective c++学习笔记
- 电厂工作票,操作票,设备管理,检修管理,缺陷管理系统
- Android 之采用execSQL和rawQuery方法完成数据的添删改查操作
- PHP文件大小格式化函数
- Android 之采用execSQL和rawQuery方法完成数据的添删改查操作
- 绝不重新定义继承而来的缺省参数——effective c++学习笔记
- 超酷网页右键菜单
- 清除所有缓存
- poj3277 线段树 + 离散化 WA2次 long long freopen
- Java报表概述
- 一种面向作业流(工作流)的轻量级可复用的异步流水开发框架JobFlow的设计与实现
- maven工程依赖JAR没有被Eclipse处理好
- win server 2008 安装oracle 的体会
- OCAF初步