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

参考:http://www.cnblogs.com/ronny/p/3756494.html

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

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

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

     derived classes内的名称会遮掩base classes内的名称。  

Derived d;
int x;
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继承之下,derived classes总是继承base class的接口。

    pure virtual函数只具体指定接口继承

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

   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)。

 

 

 

posted @ 2016-04-20 14:29  牧马人夏峥  阅读(193)  评论(0编辑  收藏  举报