15.7继承中的类作用域

继承中的类作用域

①派生类的作用域嵌套在基类作用域中

每个类定义自己的作用域,在这个作用域内我们定义类的成员。当存在继承关系时,派生类和基类的作用域会发生嵌套,派生类的作用域嵌套在基类的作用域之中。 如果一个名字再派生类的作用域中无法正确解析,则编译器将继续再外层的基类作用域中寻找改名字的定义。

如:

//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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值