本节书摘来自异步社区出版社《C++编程风格(修订版)》一书中的第3章,第3.2节,作者:【美】Tom Cargill,更多章节内容可以访问云栖社区“异步社区”公众号查看。
3.2 继承作用域准则
C++编程风格(修订版)
基类Stack的公有接口如下所示:
在派生类中,我们可以看到和基类成员函数有着同样名字的成员函数。注意,其中的Stack::pop()和Stack::push()都不是虚函数。同时,我们还注意到,派生类成员函数中的参数类型与相应的基类成员函数中的参数类型并不匹配。例如,Stack::push()不带参数,而IntStack::push()的参数是一个整数。对于这样的函数,根据C++作用域准则,这就意味着派生类的成员函数将隐藏基类的成员函数,因为在派生类中引入了新的作用域级别。在下面的示例代码中我们可以看到作用域准则的效果。
成员函数f并不是被重载。由于在派生类中定义了一个函数f,因此表达式d.f(1.5)所调用的函数就一定是派生类中的函数f。而表达式d.g(1.5)调用的则是基类的成员函数,这是因为在派生类中并没有定义成员函数g。编译器在搜索函数g的定义时,将首先在派生类中搜索,如果没有找到,那么将继续在基类中搜索。在使用派生类的对象时,我们可以只通过名字g来调用函数Base::g,但却不能简单地通过名字f来调用Base::f。
IntStack的公有接口如下所示:
根据在上面给出的作用域准则,我们调用的是IntStack或者CharStack对象自身的函数push()和pop(),而并非是从Stack继承而来的函数。IntStack和CharStack都继承了Stack的公有接口,但却用它们自身的函数把接口都隐藏了起来。在本章的后面部分将再次讨论这个问题。