`
kuwoleft
  • 浏览: 1077153 次
文章分类
社区版块
存档分类
最新评论

绝不重新定义继承而来的缺省参数——effective c++学习笔记

 
阅读更多

绝不重新定义继承而来的缺省参数(Neverredefinefunctionsinheriteddefaultparametersvalue.

讨论的前提是:不重新定义继承而来的no-virtual函数。所以,讨论的范围是:继承一个带有缺省参数值的virtual函数。

classB

{

virtualvoidfun(inti=10)=0;

}

classD:publicB

{

virtualvoidfun(inti=20);

}

classC:publicB

{

virtualvoidfun(inti);

}

这里需要明确的概念:

1、对象的静态类型:对象在声明时采用的类型。是在编译器确定的。

2、对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。

3、静态绑定:绑定的是对象的静态类型。某特性依赖于对象的静态类型。编译器绑定的。

4、动态绑定:绑定的是对象的动态类型。某特性依赖于对象的动态类型。运行期决定的。

这样就有一个问题,缺省函数是静态绑定的,而virtual函数则是动态绑定。这样,如果子类重定义了继承而来的缺省参数,同时对象的静态类型和动态类型不一样,将会出现使用的子类的函数,同时使用的是基类的缺省参数。

B*pB=NULL;

D*pD=newD();

C*pC=newC();

pB=pD;

pB->fun();//调用的是Dfun函数,默认入参是B的默认入参:10

pB=pC;

pB->fun();//调用的是Cfun函数,默认入参是B的默认入参:10

pC->fun();//编译无法通过,必须要有参数。

c++这样来处理是为了效率的考量。

可以通过NVIno-virtualinterface)手法优化设计。

附:

1、回到开头的前台,如果重新定义no-virtual函数的缺省参数,至少不会出现上面描述的诡异问题,因为他们都是静态绑定的。

2、子类继承基类的virtual函数(有缺省参数),但是子类可以不指定缺省参数。

3、对于virtual函数,如果要继承,千万不要忘掉virtual关键字。

<!--EndFragment-->
分享到:
评论

相关推荐

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

    决不要重新定义继承而来的缺省参数值,由权威的Effective C++讲述!

    Effective C++ 中文版

    条款37:绝不重新定义继承而来的缺省参数值 条款38:通过复合塑模出has-a或“根据某物实现出” 条款39:明智而审慎地使用private继承 条款40:明智而审慎地使用private继承 7.模板与泛型编程 8.定制new和delete...

    Effective C++

    条款38:绝不要重新定义继承而来的缺省参数值 条款39:避免向下转换继承层次 条款40:通过分层来体现有一个和用...来实现 条款41:区分继承和模板 条款42:明智的使用私有继承 条款43:明智的使用多继承 条款44:说你想说的...

    C++编程思想——学习C++的好书

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    c++之第五函数重载与缺省参数

    c++之第五函数重载与缺省参数c++之第五函数重载与缺省参数c++之第五函数重载与缺省参数c++之第五函数重载与缺省参数

    effective+C++.doc

    对每个人来说,习惯C++需要一些时间,对于已经熟悉C的程序员来说,这个过程尤其令人苦恼。因为C是C++的子集,所有的C的技术都可以继续使用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来很古怪,...

    从c到c++ EFFECTIVE_C++2E

    对每个人来说,习惯 C++需要一些时间,对于已经熟悉 C 的程序员来说, 这个过程尤其令人苦恼。因为C 是C++的子集,所有的C 的技术都可以继续使 用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来...

    人员类 c++(构造函数 复制构造函数 缺省参数列表)

    C++类和对象练习 构造函数 复制构造函数 缺省参数列表

    Effective C++(第三版)

    条款37:绝不重新定义继承而来的缺省参数值 never redefine a function's inherited default parameter value. 条款38:通过复合塑模出has-a或“根据某物实现出” model “has-a” or “is-implemented-in-terms-of...

    ATL——com学习笔记

    14 、如何重写 MFC 的缺省控件容器( IOleContainer )? 15 、如何重写 WebBroswer 控件的缺省安全处理功能? 16 、如何重写 WebBroswer 控件的缺省下载管理器? 17 、如何定制 IE 或 WebBroswer 控件的缺省打印...

    Effective.C++.中文第二版.50条款doc文档.chm

    条款38: 决不要重新定义继承而来的缺省参数值 条款39: 避免 "向下转换" 继承层次 条款40: 通过分层来体现 "有一个" 或 "用...来实现" 条款41: 区分继承和模板 条款42: 明智地使用私有继承 条款43: 明智地使用多继承 ...

    C++编程思想——计算机科学丛书

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    C++编程思想下(——十个字————)

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    Effective C++(第二版).

    对每个人来说,习惯C++需要一些时间,对于已经熟悉C的程序员来说, 这个过程尤其令人苦恼。因为C是C++的子集,所有的C的技术都可以继续使 用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来很 ...

    Python 缺省参数-指定函数缺省参数的默认值

    Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器...

    c++编程思想 内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    函数参数缺省与重载,命名和缺省规则

    经常看到函数定义时有好多参数,但实际调用时却只用到其中几个参数,研究老半天终于明白了

    C++经典---effective c++ 第2版(中文版).zip

    从C 转向C++, C++经典 effective c++ 第2版(中文版),宏、指针、结构、数组和函数,私有和保护型成员、函数 重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、 模板、异常、名字空间,等等。

    C++ 编程思想 象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器类、多重继承、异常处理和运行时类型识别

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

Global site tag (gtag.js) - Google Analytics