C++ 绝不重新定义继承而来的非虚(non-virtual)函数

20180323 C++ 绝不重新定义继承而来的非虚(non-virtual)函数


看下面的例子:
类D是由类B以public形式派生而来的,即:
class B{
public:
  void mf();
  ...
};


class D:public B{...};




若有以下定义:
D x;//x是一个类型为D的对象




请考虑以下两种情况:


情况1:
B* pB = &x;//获得一个指针指向x
pB->mf();//经由该指针调用mf


情况2:
D* pD = &x;//获得一个指针指向x
pD->mf();//经由该指针调用mf


考虑以下版本:
class D:public B{
public:
  void mf();
  ...
};


pB->mf();//语句1
pD->mf();//语句2


语句1调用的是B::mf,而语句2调用的是D::mf,这样产生的两种不同的调用是因为非虚(non-virtual)函数如 B::mf ,D::mf都是静态绑定(statically bound)。




若是动态绑定,即mf是个虚函数,不论是通过pB或pD调用mf,都会导致调用D::mf,因为pB和pD真正指的都是一个类型为D的对象。




/****************************************/
/*******  任何情况下都不该    ***********/
/*******  重新定义一个继承    ***********/
/*******  而来的非虚          ***********/
/*******  (non-virtual)函数   ****#******/
/****************************************/












































































































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值