私はクラスを持っています、それをA
と呼びましょう。フィールドは1つだけですaa
。クラスA
を継承する別のクラスB
があり、aa
フィールドの代わりにbb
というフィールドもあります。今、私は両方のクラスのためにoperator <<
(cout
)をオーバーロードしました。多形性を使用しようとしましたが、多形性が演算子で正しく機能しないようです。私のコードは、obj
というオブジェクトを表示するためにオペレータcout
を使用した場合、aa
フィールドのみを表示します。演算子<<オーバーロードの継承は、なぜ子クラスではなく基本クラスからの入力を得ましたか?
つまり、子クラスの基本クラスから関数をオーバーロードするには、常にvirtual
という単語を追加する必要がありますか?もしそうならどのように私は事業者と同じことを行う必要があり、事業者は、仮想することはできません...
#include <iostream>
#include <ostream>
using namespace std;
class A
{
protected :
int aa;
public:
A(int aa) {this->aa = aa;}
~A(){}
friend ostream &operator<<(ostream &os, const A& obj);
virtual void show() {cout << "a = " << aa << "\n"; }
};
ostream &operator<<(ostream &os, const A& obj)
{
for(int i=0; i<80; i++)
os << "-";
os << "\n";
os << "a = " << obj.aa << "\n";
for(int i=0; i<80; i++)
os << "-";
os << "\n";
return os;
}
class B : public A
{
private :
int bb;
public:
B(int aa, int bb) : A(aa) {this->bb = bb;}
~B(){}
friend ostream &operator<<(ostream &os, const B& obj);
void show() {cout << "a = " << aa << "\n"; cout << "b = " << bb << "\n";}
};
ostream &operator<<(ostream &os, const B& obj)
{
for(int i=0; i<80; i++)
os << "-";
os << "\n";
os << "a = " << obj.aa << "\n";
os << "b = " << obj.bb << "\n";
for(int i=0; i<80; i++)
os << "-";
os << "\n";
return os;
}
int main()
{
A *obj = new B(2,3);
cout << *obj;
obj->show();
delete obj;
return 0;
}
http://stackoverflow.com/questions/4571611/making-operator-virtual –