2012-04-28 8 views
4

で、基本クラスのostreamにフレンド関数を呼び出すと、私は2つのクラスがあります。だから、C++

class Base { 
    private: 
     int number; 
    public: 
     friend ostream & operator<<(ostream & output, const Base &n); 
} 

ostream & operator<<(ostream & output, const Base &n) { 
    output<<n.a<<endl; 
    return output; 
} 

class Child : Base { 
    private: 
     int second; 
    public: 
     friend ostream & operator<<(ostream & output, const Child &n); 

} 

ostream & output<<(ostream & output, const Child &n) { 
    output<<n.second<<Base:: ????<<endl; 
    return output; 
} 

を私の質問は、私はその内容を出力する子クラスから基底クラスのフレンド関数を呼び出すことができますどのように、次のとおりです。事前に

output<<n.second<<Base:: ????<<endl 

感謝:)

答えて

3

あなたはキャストを嫌うなら:

ostream & operator<<(ostream & output, const Child &n) { 
    const Base& b(n); 

    output<< n.second << b << endl; 
    return output; 
} 

ところで、一般的には、std::endlを発信者のストリームに入れることをお勧めします。

3
output<<n.second<<static_cast<const Base&>(n)<<endl; 
+0

なぜああなぜあなたはポインタを通過するだろうか? 'static_cast (n)'は完全に細かく冗長ではありません。 @MatthieuM。 –

+0

一定。 – David

2

実際...私は代替案を提案します。

あり仮想メソッドずに基本クラスを持つ少しポイントがあるので、ちょうど1仮想メソッドを追加してみましょう:)

class Base { 
public: 
    virtual void print(std::ostream& out) const { /**/ } 

}; 

inline std::ostream& operator<<(std::ostream& out, Base const& b) { 
    b.print(out); return out; 
} 

、我々は派生クラスでこのメソッドをオーバーライド:

class Derived: public Base { 
public: 
    virtual void print(std::ostream& out) const override { 
     out << /* specific */; 
     this->Base::print(out); /* base */ 
    } 
};