6

だから、私は2つのクラスがあります:

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

前もって感謝します :)

4

3 に答える 3

5
output<<n.second<<static_cast<const Base&>(n)<<endl;
于 2012-04-28T20:36:46.360 に答える
3

実は... 別のスキームを提案します。

仮想メソッドのない基本クラスを持つ意味はほとんどないので、仮想メソッドを 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 */
    }
};
于 2012-04-28T20:49:02.440 に答える
3

キャストを嫌う場合:

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

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

std::endlところで、一般的には、 to ストリームを呼び出し元に置いておくのがおそらく最善です。

于 2012-04-28T20:40:52.467 に答える