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 { ... };