2

私が投稿した最近の質問のコメント ( C++: 派生クラス コンストラクターで基底クラス代入演算子を呼び出すには不適切な形式ですか? ) で、静的_キャストを使用して派生型から基底型に移動する方法に関して、別の問題に遭遇しました。この問題のサポート ドキュメントは次の場所にあります: Why does static_cast(*this) to a base class create a temporary copy? .

私の主な問題は、 static_cast を使用してこれを派生クラス内の基本クラスにキャストすることに問題がないことです。ただし、派生参照から基本参照への静的キャストを実行できません。これは、派生クラスの等価演算子でのみ行います。問題は次のとおりです。

bool Derived::operator==(const Derived& other_derived) {
  // first call the operator == from the base class...
  if (static_cast<Base&>(*this) == static_cast<Base&>(other_derived)) {
    // continue checks for derived member variables
  }
}

コンパイラは、上記の if ステートメントで叫びます。これの static_cast は問題ありませんが、派生クラスから基底クラスへの static_cast を解釈できません。参照を削除すると、これは正常にコンパイルされますが、参照されている 2 つの質問に示されているように、一時オブジェクトが不必要に作成されます。

その結果、派生クラスから基本クラスに移動するためのコンストラクターが不足している可能性があるのではないかと考えています。そのようなコンストラクターはどこに記述しますか (基本型のコンストラクターであるため)。ベースのソースコード内でこれを行うのは意味がないと思います。それは本質的にベースクラスをカスタム化し、再利用可能なコードの精神を台無しにするのではないでしょうか?

より簡単な代替手段は、この関数内でオブジェクトの一時的な作成を受け入れることですが、関数が頻繁に呼び出される可能性があるため、パフォーマンスの低下を受け入れることができるかどうかわかりません。

他に考慮すべきことはありますか?いつものように、助けてくれてありがとう。

4

1 に答える 1