4

サブクラスで仮想比較演算子をオーバーライドしようとしていますが、派生クラスが基本クラスの仮想演算子を実装していないというコンパイラ エラーが発生します。

私の派生演算子が基本クラスの引数の型を使用していないという事実に関係しているように感じます。

簡略化されたバージョンは次のようになります。

struct Base {
  virtual bool operator ==(const Base) const;
};

struct Derived : Base {
  bool operator ==(const Derived) const {
    // implementation goes here
  }
};

これを行う方法はありますか、それともDerived実装で型チェックを行って正しい型かどうかを確認する必要がありますか?

4

2 に答える 2

3

私の派生演算子が基本クラスの引数の型を使用していないという事実に関係しているように感じます。

まさにそうです。基本クラスは const参照を取得する必要があります(動的な型を持つことができるようにするためDerived、オーバーライドを次のように宣言します。

bool operator ==(const Base& rhs) const {
    const auto pRhs = dynamic_cast<const Derived*>(&rhs);
    if (pRhs == nullptr)
    {
        return false;  // Not a derived.  Cannot be equal.
    }
    // Derived/Derived implementation goes here
}

ただし注意してください: このような仮想比較演算子は非常に間違いやすいです。このようにするには、やる気を起こさせる良い例が必要です。特に、次のように記述した場合:

Derived d;
Base b;
if (d == b)  // All is well - derived override called, and returns false.

if (b == d) // Uh-oh!  This will call the *base* version.  Is that what you want?

また:

Derived d;
DerivedDerived dd;

if (d == dd) // Did you want to use the DerivedDerived comparison?
于 2016-10-31T18:07:58.440 に答える