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

C++缺省参数与虚函数
本文探讨了C++中缺省参数与虚函数结合使用时可能产生的问题,特别是当子类重定义继承而来的缺省参数时,可能会导致默认参数值与预期不符的情况。文章还介绍了如何通过NVI(无虚接口)手法来优化设计。

绝不重新定义继承而来的缺省参数(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-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值