繁体   English   中英

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

[英]Why can't I call the base class operator from derived class?

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

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&)'在此上下文中受到保护返回static_cast(* this)== static_cast(other);

我无法理解为什么我无法从派生类访问此运算符。

我在询问前做了一些搜索,发现这个看起来很相似的问题 然而:

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

在第2点,让我详细说明:@Barry 接受的答案表明,当对象转换为基类时...所以它无法访问基类的成员! 这是为什么 ? 我不清楚这一点。

有人可以在这里给出一个明确的解释(可能还有一个解决方案......)?

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

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

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

总而言之,看起来像:

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

看它在这里运行: ideone

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

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

更多在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM