码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++ Item 36 绝不重新定义继承而来的 non-virtual 函数

时间:2014-07-12 19:09:10      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   cti   io   

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


经验:绝对不要重新定义继承而来的 non-virtual 函数 --> Item 7 "为多态基类声明 virtual 析构函数" 是本条款的特例
示例:
class B{
public:
	void mf();
	//...
};
class D: public B{
public:
	void mf(); // 遮掩了B::mf,Item 33 名称遮掩规则
}


D x;
B *pB = &x;
D *pD = &x;
pB->mf(); // 调用  B::mf
pD->mf(); // 调用  D::mf


解析:
1.non-virtual函数是静态绑定的。 pB声明的类型(pointer-to-B)是静态的,而pB指向的类型(class D)是动态的,
通过pB 调用的 non-virtual函数永远是B所定义的版本
2.
public 继承意味着is-a,适用于B对象的每一件事,也适用于D对象,因为每个D对象都是一个B对象
不变性凌驾特异性,B的derived classes一定会继承 mf 的接口和实现,因为 mf是B的一个 non-virtual 函数
重新定义继承 non-virtual函数后产生的茅盾:
如果D真有必要实现出与B不同的mf,那么“每个D都是一个B”就不为真,就不应该以 public 形式继承 B
如果D真的必须以 public 形式继承B,并且如果D越有需要实现出与B不同的 mf,那mf就无法为B反映出“不变性凌驾特异性”的性质


Effective C++ Item 36 绝不重新定义继承而来的 non-virtual 函数,布布扣,bubuko.com

Effective C++ Item 36 绝不重新定义继承而来的 non-virtual 函数

标签:style   blog   http   color   cti   io   

原文地址:http://blog.csdn.net/zhengsenlie/article/details/37723813

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!