私は基本クラスといくつかの派生クラスを持っています。これらの派生クラスに対して "< <"演算子をオーバーロードしたいと思います。通常の演算子、つまり「+」では、仮想関数がトリックを行います。私は標準的な慣習であることを理解することは私のクラス内<<演算子と継承クラスのオーバーロード
friend ostream& operator<<(ostream& out, MyClass& A);
を宣言し、クラスの後に関数を定義することです。先験的に、私は上記の定義に仮想を追加すると動作すると思うでしょうが、いくつかの考え(そして私のコンパイラからのエラー)の後、それはあまり意味がないことを理解しています。
すべてのクラスメンバーが公開されているテストケースで、さまざまなタックを試しました。例えば: - 基底クラスのオペレータ< <派生クラスの演算子ではなく、呼び出されている
class Foo{
//bla
};
ostream& operator<<(ostream& out, Foo& foo){
cout << "Foo" << endl;
return foo;
}
class Bar : public Foo{
//bla
};
ostream& operator<<(ostream& out, Bar& bar){
cout << "Bar" << endl;
return bar;
}
///////////////////////
Bar bar = Bar();
cout << bar << endl; // outputs 'Foo', not 'Bar'
だから、いくつかの方法で、これは「悪いなくなっ多型」です。上の例では、派生クラスのために正しい演算子を呼び出す方法を教えてください。さらに一般的には、私のクラスにプライベートメンバーがいて保護したいのであれば、friendキーワードを使ってオペレータのオーバーロードを修正するにはどうしたらいいですか?
完全に動作します。ありがとう。 – andyInCambridge
これには2つの欠陥があると思います。 1つの欠陥は大きな欠陥であり、もう1つは小さな欠陥です。巨大な欠陥が最初に...あなたは目に見えないほどの 'endl'を置くべきではありません。 'endl'はストリームを強制的にフラッシュしますが、これは状況によっては大きなパフォーマンス上の問題となります。 ''\ n' 'を使います。実際、 'endl'は' \ n 'を出力するという意味で定義されており、オーバーヘッドが発生しません。次に、 'return out <<" Foo \ n ";"。少し洗練されています。概念的には、すべてのものを '<<'操作の長い連鎖に変えます。 – Omnifarious
@Omnifarious 'endl'を' operator << 'オーバーロードに決して入れません。 OPのコード。 –