仮想オペレーターの実装<<
仮想オペレーターの必要性<<これは、さまざまなクラスのストリーミング オペレーターの動作をカスタマイズするときに発生します。演算子を仮想として定義しようとすると、多くの場合、「演算子 <<: メンバー関数と基底のみが仮想にできます。」というエラーが発生します。
自由関数のジレンマ
演算子<<が原因で問題が発生します。通常、これは自由関数として定義されますが、これにはレシーバー オブジェクトがなく、仮想にすることはできません。一方、演算子をメンバー関数として定義すると、パラメーターの順序が逆になり、コンパイル エラーが発生します。
間接法による解決策
このジレンマを解決するには、次のようにします。目的の出力動作をカプセル化する仮想メンバー関数の追加を検討してください。
<code class="cpp">class MyClass { public: virtual void print(ostream& out) const; // Virtual output function };</code>
仮想動作を使用したカスタマイズされた演算子
仮想メンバー関数を配置すると、以下を定義できます。演算子
<code class="cpp">ostream& operator<<(ostream& out, const MyClass& mc) { mc.print(out); // Calls the virtual print function return out; }</code>
このアプローチでは、演算子の正しいパラメーター順序が維持されます無料の関数であると同時に、仮想メンバー関数を通じて出力動作をカスタマイズできます。サブクラスは print 関数をオーバーライドして、独自のカスタム出力形式を実装できます。
以上がなぜ「演算子」を作れないのかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。