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