您的位置:首页 > 编程语言 > C语言/C++

Effective C++笔记(六):继承与面向对象设计

2016-04-20 14:29 435 查看
参考:http://www.cnblogs.com/ronny/p/3756494.html

条款32:确定你的public继承塑模出is-a关系

“public继承”意味着is-a。适用于baseclasses身上的每一件事情一定也适合于derivedclass身上,因为每个derivedclasses对象也都是一个baseclasses对象。

条款33:避免遮掩继承而来的名称

derivedclasses内的名称会遮掩baseclasses内的名称。

Derivedd;
intx;
d.mf1();//ok,调用Derived::mf1
d.mf1(x);//error,因为Derived::mf1遮掩Base=::mf1
d.mf2();//ok,调用Base::mf2
d.mf3();//ok,调用Derived::mf3
d.mf3(x);//error,因为Derived::mf3遮掩了Base::mf3

条款34:区分接口继承和实现继承

接口继承和实现继承不同。在public继承之下,derivedclasses总是继承baseclass的接口。

purevirtual函数只具体指定接口继承

简朴的(非纯)impurevirtual函数具体指定接口继承及缺省实现继承。

non-virtual函数具体指定接口继承以及强制性实现继承

条款35:考虑virtual函数以外的其他选择

。。。。。。。。

条款36:绝对不重新定义继承而来的non-virtual函数

当派生类中重新定义了基类中的non-virtual函数时,如果用指向基类类型的指针(实际指向派生类对象)来访问该non-virtual函数时,访问的是基类对象的non-virtual函数。

造成上面行为的原因是,non-virtual是静态绑定的,区别于virtual函数的动态绑定。

条款37:绝不重新定义继承而来的缺省参数值

virtual函数系动态绑定的,而缺省参数值是静态绑定的。

条款38:通过复合塑模出has-a或“根据某物实现出”

复合或包含意味着has-a。如果我们想设计一个自己的set,我们思考后觉得可以用list来实现它,但是如果我把它设计出list的一个派生类,就会有问题,

因为父类的所有行为在派生类都是被允许的,而list允许元素重复,而set则显然不行,所以set与list之间不符合is-a关系,我们可以把list设计为set的一个成员,即包含关系(has-a)。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: