考虑以下代码,该代码尝试从派生的类运算符调用基类比较运算符:
struct Base
{
protected:
int _a;
bool operator == ( const Base& other ) const
{
return (_a == other._a);
}
};
struct Derived : public Base
{
bool operator == ( const Derived& other ) const
{
return static_cast<Base>(*this) == static_cast<Base>(other);
}
};
int main()
{
Derived b1, b2;
if( b1 == b2 )
;
}
此操作失败,并显示以下信息:
main.cpp:25:61:错误:'bool Base :: operator ==(const Base&)'在此上下文中受保护 return static_cast(* this)== static_cast(other);
我不明白为什么我不能从派生类访问此运算符。
我在询问之前做了一些搜索,发现this other question看起来很相似。但是:
关于第2点,我要详细说明:@Barry的accepted answer建议将对象转换为基类……因此它无法访问基类的成员!这是为什么 ?我不清楚。
有人可以在这里对情况进行清楚的解释(并可能提供解决方案...)吗?
如果您认为可能还有其他问题可以澄清这种情况,请链接到它(我找不到)。
答案 0 :(得分:7)
您可以直接显式地调用Base比较运算符,而不必自己尝试进行静态强制转换,而是尝试使编译器解析为调用Base运算符。
此外,由于这不会修改对象,因此您可能应该将此方法(和基本方法)设为const
。
总共看起来像:
bool operator == ( const Derived& other ) const
{
return Base::operator==(other);
}
看到它在这里运行:ideone
答案 1 :(得分:3)
11.5受保护的成员访问权限[class.protected]
当派生类的朋友或成员函数引用一个 受保护的非静态成员函数或受保护的非静态数据成员 的基础类,除了那些访问检查 在第11.102节中更早的描述)形成指针时除外 成员(5.3.1),访问必须通过指向,引用, 或派生类本身的对象(或从该派生类派生的任何类) 类)(5.2.5)。如果访问要形成指向成员的指针,则 nested-name-specifier应命名派生类(或任何类) 从该类派生的。)