【问题标题】:Why can't I call the base class operator from derived class?为什么我不能从派生类调用基类运算符?
【发布时间】:2019-09-02 14:14:11
【问题描述】:

考虑这段代码,它试图从派生类运算符中调用基类比较运算符:

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 建议将对象转换为基类......所以它不能访问基类的成员!这是为什么 ?我不清楚。

有人可以对这里的情况给出一个清晰的解释(并可能提供解决方案......)吗?

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

【问题讨论】:

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


    【解决方案1】:

    您可以直接显式调用 Base 比较运算符,而不是尝试自己进行静态转换以尝试让编译器解析调用 Base 运算符。

    此外,由于这不会修改对象,您可能应该将此方法(和基本方法)设为const。

    看起来像这样:

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

    在这里运行:ideone

    【讨论】:

      【解决方案2】:

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

      当派生类的朋友或成员函数引用一个 受保护的非静态成员函数或受保护的非静态数据成员 对于基类,除了那些之外,还应用访问检查 早在第 11.102 节中描述)除非形成指向 成员(5.3.1),访问必须通过指针,引用, 或派生类本身的对象(或从该类派生的任何类 类)(5.2.5)。如果访问是形成一个指向成员的指针,则 嵌套名称说明符应命名派生类(或任何类 派生自该类)。

      More in here

      【讨论】:

      • 谢谢,很棒的链接,第一个答案清楚地说明了问题,我想我明白我的代码出了什么问题。
      猜你喜欢
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 2012-04-21
      相关资源
      最近更新 更多