读书人

effective c++ - 沿袭与面向对象设计

发布时间: 2012-09-01 09:33:03 作者: rapoo

effective c++ -- 继承与面向对象设计
继承与面向对象设计中,涉及了继承方式,即public、private及protected继承方式,继承体系中的屏蔽问题,成员函数virtual、non-virtual的选择以及多重继承等。

Item 32: 确定你的public继承塑模出is-a关系
以C++进行面向对象编程,最重要的一个规则是:public inheritance意味is-a的关系,于是,基类对象B可以派上用场的地方,继承类对象D一样可以派上用场。
类之间除了存在is-a关系外,还可能存在has-a和is-implementated-in-terms-of的关系。

[b]Item 33: 避免遮掩继承而来的名称
在继承体系下,C++名字查找规则如下:
(1)在函数内查找;
(2)在类内查找;
(3)在基类内查找;
(4)在命名空间内查找;
(5)在全局域内查找。
把(1)~(5)看成在不同域内查找,在每个域内,编译器首先查找所有名字匹配的变量、函数,如果是函数,还会找出其最佳匹配,只要名字在某一步中的领域内匹配了,编译器便不会再往更大的范围查找。编译器总是在匹配完后才检验其可用性,即共访问修饰符public, private等。

我们来看下面一个例子:

class InputFile: virtual public File { ... };class OutputFile: virtual public File { ... };class IOFile: public InputFile, public OutputFile { ... };

这样看来我们似乎应该总是用virtual public取代public,可是想一想为避免继承得来的成员变量重复,编译器必须提供若干幕后戏法,而其后果是:使用virtual继承的那些class所产生的对象往往比使用non-virtual继承的兄弟们大,访问virtual base class的成员变量时也比访问non-virtual base class的成员变量速度慢。
因此作者给出的关于virtual继承的忠告:(1)非必要不使用virtual base;(2)如果必须使用virtual base classes,尽可能避免在其中放置数据。
书中最后还用了一个例子来说明多重继承的正当用途,其中涉及“public继承某个interface class”和“private继承某个协助实现的class”的两相组合。

呵呵,感觉这一章总结得很潦草,其中很多想法,大概要到真正应用中,才能体会其艺术吧。

读书人网 >C++

热点推荐