簡體   English   中英

子類中的重載流插入運算符(<<)

[英]Overloaded stream insertion operator (<<) in the sub-class

我有一個A類,為此我定義了一個(重載)流插入運算符。 我公開從該類A派生一個類B,它有一個附加的數據成員。 因此,我需要為派生類重新定義重載的流插入運算符,並且我可以通過以下方式進行操作:

#include <iostream>

using namespace std;

class A {
    int i;
    char c;
public:
    A(int i = 0, char c = ' ') {
        this->i = i;
        this->c = c;
    }
    friend ostream& operator << (ostream&, const A&);
};

class B : public A {
    double d;
public:
    B(int i = 0, char c = ' ', double d = 0.0) : A(i, c), d(d) {}
    friend ostream& operator << (ostream&, const B&);
};

ostream& operator << (ostream& out, const A& a) {
    out << "\nInteger: " << a.i << "\nCharacter: " << a.c << endl;
    return out;
}

ostream& operator << (ostream& out, const B& b) {
    out << b;
    out << "\nDouble: " << b.d << endl;
    return out;
}

int main() {
    A a(10, 'x');
    B b(20, 'y', 5.23);
    cout << b;

    return 0;
}

問題1:這樣做是否合適? 如果沒有,請讓我知道我要去哪里。

問題2:在運行時,該程序崩潰。 為什么這樣?

支持此操作的一種常用方法是讓重載的運算符調用虛擬成員函數:

class A { 
public:
    virtual std::ostream &write(std::ostream &os) const { 
        // write self to os
        os << "A\n";
        return os;
    }
};

class B : public A { 
public:
    virtual std::ostream &write(std::ostream &os) const { 
        // write self to os
        // This can use the base class writer like:
        A::write(os);
        os << "B\n";
        return os;
    }
};

然后,運算符重載僅調用該成員函數:

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

由於write是虛擬的,你要傳遞A由(常量)的參考,這將調用根據實際類型正確的成員函數(即A::write如果對象是真正的實例A ,和B::write如果是B的實例)。

例如,我們可以執行以下操作:

int main() { 
    A a;
    B b;

    std::cout << a << "\n";
    std::cout << b << "\n";
}

...產生如下輸出:

A

A
B

在實際使用中,您可能希望使write函數受到保護,並使operator<<A的朋友。

該程序崩潰,因為您的第二個插入運算符調用了自己:

ostream& operator << (ostream& out, const B& b) {
  out << b;  // <--YIKES!
  out << "\nDouble: " << b.d << endl;
  return out;
}

通常,這是一個好方法,盡管我更喜歡為類提供一個公共虛擬print(ostream&) const函數, print(ostream&) const插入運算符調用該函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM