2016-12-31 84 views
0

如果我有一個抽象類,姑且稱之爲「脊椎動物」,它有一個場std::string name;,它有一個純虛方法 virtual void print(std::ostream&) const noexcept = 0;將在子類中重寫,並呼籲在operator<<操作<<在抽象類中,C++

我得到了多態如何工作,以及如何在繼承類中實現operator<<

我沒有得到什麼:

我不明白這一點:如何實現在抽象類的operator<<,使用虛擬打印功能。爲什麼這段代碼不起作用?我的抽象類需要有operator<<

virtual void print(std::ostream&) const noexcept = 0; 
std::ostream & operator<<(std::ostream & str, Member &obj) 
{ 
    return obj.print(str); 
} 

這是抽象類代碼。

+0

'的operator <<'用於流輸出必須是獨立的,非成員函數。你一直說「我的班級有'operator <<'」或「implement'operator''在某個班級中」 - 你究竟是什麼意思?無論如何,一個非成員函數'std :: ostream&operator <<(std :: ostream&str,Vertebrate&obj){obj.print(str);返回str; }'應該適用於從'Vertebrate'派生的所有類 - 對於每個類你不需要單獨的類。 –

回答

2

您正在嘗試返回print的結果,即void,但operator<<應返回std::ostream

以下應該工作:

class Vertebrate 
{ 
    // ... 
    virtual void print(std::ostream&) const noexcept = 0; 
}; 

std::ostream& operator<<(std::ostream& stream, Vertebrate& obj) 
{ 
    obj.print(stream); 
    return stream; 
}