【问题标题】:Operator '...' has the override specifier but does not override a base class member运算符“...”具有覆盖说明符但不覆盖基类成员
【发布时间】:2019-12-06 15:41:50
【问题描述】:

我正在尝试继承一个抽象类并覆盖它的所有纯虚函数

class A
{
    virtual bool operator==(const A&) const = 0;
}

class B : A
{
    bool operator==(const B& rhs) const override
    {                                   ^^^^^^^^---problem here
        // Comparison
    }
}

错误:

运算符 'bool B::operator==(const B& rhs) const' 具有 'override' 说明符,但不覆盖基类成员

【问题讨论】:

  • 如果你也有派生类C,你对A&& a1 = B(); A&& a2 = C(); a1 == a2;有什么期望?访客模式可能有助于进行多次调度。

标签: c++ inheritance abstract-class


【解决方案1】:

当签名不同时,您不能覆盖 virtual 基类函数。在class B,一定是

bool operator==(const A&) const override;
//                         ^^ must be reference to A

请注意,测试运行时多态类型的相等性总是很奇怪;您抽象出类型,然后尝试比较两个实例-但是跨派生类型应该如何发生呢?尝试为打算与值语义一起使用的类保留 operator==

【讨论】:

  • 如果 B 有一些私有成员,如果参数是 A 类型,我如何访问它们?
  • 你不能,除非有一些dynamic_cast<B*> hack。但我会尽量避免这种情况。您正在尝试小规模实施双重调度。这种语言没有给你那种灵活性,我猜访问者模式会有点过头了。
  • 我不明白为什么它在 c++ 中是不允许的。如果我希望所有继承 A 的类都有一个相等运算符,我该怎么办?
  • 您可以将运算符实现为非virtual 函数。然后,您无法通过 == 与静态 A 实例进行比较,但正如我所说,在我看来,这首先是令人困惑的。
  • 仍然,它应该如何处理不同类的两个对象?您可能想要的是所谓的“概念”,如下所示:en.cppreference.com/w/cpp/named_req/EqualityComparable 它可以在 C++20 中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多