为什么不能从派生类调用基类运算符?

时间:2019-04-11 20:54:48

标签: c++ c++11 inheritance operators

考虑以下代码,该代码尝试从派生的类运算符调用基类比较运算符:

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看起来很相似。但是:

  1. 在另一个问题中,当我需要比较相同类型的对象时,OP希望将其(派生类)与基类对象进行比较。
  2. 我不明白给出的解释。
  3. 情况有些不同:在另一个问题中,被接受的答案建议对派生类中的基本成员进行比较。如果我必须在基类中进行比较怎么办?

关于第2点,我要详细说明:@Barry的accepted answer建议将对象转换为基类……因此它无法访问基类的成员!这是为什么 ?我不清楚。

有人可以在这里对情况进行清楚的解释(并可能提供解决方案...)吗?

如果您认为可能还有其他问题可以澄清这种情况,请链接到它(我找不到)。

2 个答案:

答案 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应命名派生类(或任何类)   从该类派生的。)

More in here