C++中派生类访问基类protected成员的范围

C++新手程序员的一个常见误解是访问基类的 protected 成员的范围:

class Query {
public:
const vector<location>* locations() const { return &_loc; }
// ...
protected:
vector<location> _loc;
// ...
};

我们是在说从 Query 派生的类可以直接访问数据成员_loc 而程序的其余部分必须使用公有访问函数 但是 派生类访问其自身的基类子对象的 protected 数据成员_loc 又意味着什么? 派生类不能访问另一个独立的基类对象的protected 成员 例如:

bool
NameQuery::
compare( const Query *pquery )
{
// ok: 自己的 Query 子对象的 protected 成员
int myMatches = _loc.size();
// 错误: 没有 "直接访问另一个独立的 Query
// 对象的 protected 成员" 的权利
int itsMatches = pquery->_loc.size();
return myMatches == itsMatches;
}
NameQuery 只能访问一个 Query 类对象的 protected 成员 即是它自己的 Query 子对象 这些 protectdd 成员在派生类中通过隐式 this 指针被访问 , 解决这个编译时刻错误的最直接办法是利用公有成员函数 location()重写 compare()函数
bool
NameQuery::
compare( const Query *pquery )
{
// ok: 其 Query 子对象的 protected 成员
int myMatches = _loc.size();
// ok: 使用公有访问的方法
int itsMatches = pquery->locations()->size();
return myMatches == itsMatches;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值