[英]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.