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

5
考虑以下代码,它试图从派生类运算符中调用基类比较运算符:
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: error: 'bool Base::operator==(const Base&)' is protected within this context return static_cast(*this) == static_cast(other);

我不明白为什么不能从派生类中访问此运算符。

在提问之前,我进行了一些搜索,并找到这个问题,看起来很相似。但是:

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

关于第2点,让我详细说明一下:@Barry所接受的答案认为,由于对象被转换为基类,因此不能访问基类的成员!为什么呢?这对我来说不清楚。

能否有人清楚地解释一下这里的情况(并可能提供解决方案...)?

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

2个回答

8

不要试图自己进行静态转换以尝试让编译器调用基类的操作符,可以直接显式调用基类比较操作符。

此外,由于这不会修改对象,因此您应该将此方法(和基类方法)设置为const

所有内容如下:

bool operator == ( const Derived& other ) const
{
    return Base::operator==(other);
}

在这里运行它:ideone。该链接是相关的IT技术内容。

3

11.5 受保护成员访问 [class.protected]

当派生类的友元或成员函数引用基类的受保护非静态成员函数或受保护非静态数据成员时,除了描述在第11.10节中的之前所述的那些之外,还会应用访问检查。除非形成成员指针(5.3.1),否则访问必须通过指向、引用或派生类本身(或任何从该类派生的类)的对象来进行(5.2.5)。如果访问是为了形成成员指针,则嵌套名称限定符应命名派生类(或任何从该类派生的类)。

更多信息请点击此处


1
谢谢,链接很棒,第一个答案把事情讲得很清楚,我想我明白了我的代码出了什么问题。 - kebs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接