2017-05-18 26 views
-2

私はC++を使用しています。使用親オペレータへの呼び出し<< C++

ostream & operator<<(std::ostream & os, const Worker & obj) 
{ 
    return os << "First Name: " << obj.GetFirstName() << ", Last Name: " << obj.GetLastName() << " ,ID: " << obj.GetID() << ", WorkPlace: " << obj._workPlace << endl; 
} 

は、私は次のように< <をopeator上書きしようとしている(Hファイル):

friend ostream& operator<<(std::ostream& os, const Worker& obj); 

CPP

Person *w2 = new Worker("First Name", "Last Name", "123456789", "String"); 

cout << w2; 

しかし、オペレータ< <呼び出されません。

間違いは何ですか?

ありがとうございます。

+2

'cout << * w2;'が必要です。 – songyuanyao

+0

'Person'ではなく' Person * 'を指定します。 –

+1

ポインタと 'new'を避けてください。 –

答えて

0

あなたstd::cout << w2;の代わりstd::cout << *w2;誤差が大きな問題に隠されています:あなたはオーバーライドすることにより、多型を使用しようとしているただし、PersonポインタがWorkerオブジェクトを実際に指している場合でも、friend ostream& operator<<(std::ostream& os, const Worker& obj)Personに対して呼び出されません。

多型の解決策は、派生クラスによってオーバーライドできる仮想関数を呼び出す基本クラスのためにoperator<<をオーバーロードすることです。

struct Base 
{ 
    virtual std::string toString() { return "Base"; } 
} 

struct Derived: Base 
{ 
    virtual std::string toString() { return "Derived"; } 
} 

ostream & operator<<(std::ostream & os, const Base & obj) 
{ 
    return os << obj.toString() << endl; 
} 
1

w2Personオブジェクトへのポインタで、operator<<にはconst参照が必要です。あなたはどちらかPerson*を取るか、

cout << *w2; 
0

を使用しかしoperator<<が呼び出されない別の<<オペレータを書くことができます。

間違いは何ですか?

ポインタ(例:アドレス)を渡すと、結果が出力に表示されるためです。あなたは、実際のオブジェクトがWorkerであることを確信している場合は、WorkerPersonから戻って唱えてもよい、

Worker *w2 = new Worker("First Name", "Last Name", "123456789", "String"); 
cout << *w2; 

か:あなたはWorkerためoperator<<を持っているので

、あなたは、このようにそれを行う必要があり

Person *w2 = new Worker("First Name", "Last Name", "123456789", "String"); 
cout << *(Worker*)w2; 
0

これは無効になっていません。仮想メンバ関数をオーバーライドします。これはのオーバーロードであり、呼び出す関数は実行時にオブジェクトの型からではなく、コンパイル時に変数の型から決定されます。

だからPerson&ないWorker&なのでPersonからWorker継承は、さえ*w2を使用すると、動作しませんと仮定。

基本クラスに仮想出力関数を追加し、それを上書きして、親演算子をこの関数のみを呼び出す関数に置き換えます。

class Person 
{ 
    public: 
    // ... 
     virtual void write(std::ostream& os); 
    }; 

std::ostream& operator<<(std::ostream& os, const Person& p) 
{ 
    p.write(os); 
    return os; 
} 

class Worker : public Person 
{ 
    public: 
    // ... 
     void write(std::ostream& os) override; 
}; 

基本クラス以外の演算子は必要ありません。

関連する問題