2011-05-27 42 views
2

嘿,夥計們,有問題即時通訊時,我想創建一個名爲文件類使用fstream的如何實現繼承的形式fstream的

#include<iostream> 
#include<fstream> 
class Files:public fstream { 
    public: 
     Files(const char* s,ios_base::openmode mode = ios_base::in | ios_base::out):fstream(s,ios_base::openmode mode = ios_base::in | ios_base::out) 
    }; 

有誰知道我應該在構造函數中使用哪些參數?

+0

應該作爲,'文件(爲const char * S一樣簡單,的ios_base ::用於openmode模式=的ios_base ::在|的ios_base ::出來):fstream(s,mode)' – iammilind 2011-05-27 06:00:15

+3

這是如何*不*使用繼承的完美例子。你在第一句話中告訴我們:「文件」使用「fstream」,而不是「fstream」。因此,最好將fstream類型的成員變量添加到文件中,而不需要再解決您的問題。 – 2011-05-27 06:01:40

回答

2

不要重複默認參數。您的代碼應該是這樣的:

#include<iostream> 
#include<fstream> 

class Files : public std::fstream { 
    public: 
     Files(const char* s, 
      std::ios_base::openmode mode = ios_base::in | ios_base::out) 
     : fstream(s, mode) 
     {} 
}; 

這就是說,你可能要考慮使用Boost.Iostreams如果要定義自己的流類。覆蓋標準流中的所有正確方法是一種痛苦。

-2

不要從沒有虛析構函數的類繼承

+1

如果只是將非虛函數添加到類中,則沒有問題。 – neuront 2011-05-27 06:25:59

+7

這不是一個很好的概括,也不適用。 'std :: fstream'具有一個虛擬析構函數,因爲從(例如)具有聲明爲析構函數的'std :: ostream'中繼承。 (如果一個類有一個虛擬析構函數的基類,它的析構函數(無論是用戶還是隱式聲明的)都是虛擬的。「)(ISO/IEC 14882:2003 12.4) – 2011-05-27 06:28:40