继承中的类作用域
①派生类的作用域嵌套在基类作用域中
每个类定义自己的作用域,在这个作用域内我们定义类的成员。当存在继承关系时,派生类和基类的作用域会发生嵌套,派生类的作用域嵌套在基类的作用域之中。 如果一个名字再派生类的作用域中无法正确解析,则编译器将继续再外层的基类作用域中寻找改名字的定义。
如:
//isbn在基类Quote中,DiscQuote是Quote的派生类,BulkQuote是DiscQoute派生类
BulkQuote bulk;
cout << bulk.isbn();
名字isbn的解析将按照如下过程所示:
- 在BulkQuote的作用域内查找,没有找到名字isbn
- 在BulkQuote的直接基类DiscQuote作用域中查找,没有找到名字isbn
- 在DiscQuote的直接基类Quote的作用域中查找,找到名字isbn,所以我们使用的isbn最终被解析为Quote的isbn。
②名字冲突与继承
派生类也能重新定义在其直接基类或间接基类中的名字,此时定义在内层作用域(派生类作用域)的名字将隐藏定义在外层作用域(基类作用域)的名字:
class A {
public:
A():_mem(0) {}
protected:
int _mem;
};
class B : public A {
public:
B(int val):A(), _mem(val) {}
int getMem() {
return _mem;
}
int getAMem();
protected:
int _mem;
};
int main() {
B b(42);
cout << b.getAMem() << endl;
}
//输出结果是:
42
可以通过作用域运算符来使用被隐藏的同名基类成员:
int B::getAMem() {
return A::_mem;
}
int main() {
B b(42);
cout << b.getAMem() << endl;
}