2016-04-05 3 views
2

私はクラスを持っています、それを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; 
} 
+2

http://stackoverflow.com/questions/4571611/making-operator-virtual –

答えて

2

私は意味、私は常に基本クラスから機能をオーバーロードするために仮想世界を追加する必要があります子どものクラスで?もしそうなら、私はどのように演算子で同じことをしなければならない、演算子は仮想であることができません...

確かにすることができます。しかしメンバー関数だけが仮想であり、これらの演算子はメンバ関数ではありません - それらはグローバル関数です。

この場合、メンバー関数を作成することはできません(最初のパラメーターはクラスのインスタンスではないため)。しかし、あなたは仮想メンバ関数を作成し、オペレータがそれを呼び出すかもしれない:

class A 
{ 
protected: 
    virtual void print(ostream &); 
public: 
    friend ostream &operator<<(ostream &os, const A& obj); 
    // ... other stuff ... 
}; 

ostream &operator<<(ostream &os, const A& obj) 
{ 
    obj.print(os); 
    return os; 
} 

、その後 printの代わり operator<<を上書きします。

+0

私がそれらのメンバ関数を作成した場合、それは何ですか? – yak

+0

@yakメンバー関数として 'ostream&operator <<(ostream&os)'を追加した場合、 '* obj << cout'を実行できます。 – immibis

+0

ありがとうございます。 '++'と '--'演算子のように、他の演算子についてはどうでしょうか?私はそれらのうちの1つをオーバーロードしました。なぜこのコードでseg faultが発生しているのか分かりません:http://pastie.org/private/rtsoerb0whoskzayu3ijq。クラス「B」は、クラス「A」からオーバーロードされたすべての演算子を継承すると考えました。 – yak

関連する問題