2012-02-10 67 views
1

我有數個代表各種計算機組件的類,其中的每一個都一個重載<<操作者聲明如下:重載輸出操作者

friend ostream& operator << (ostream& os, const MotherBoard& mb); 

每個返回一個ostream對象與描述唯一流該組件,其中一些組件由其他組件組成。我決定創建一個名爲Component的基類,以便生成一個唯一的id以及所有組件將公開派生的其他一些功能。當然,超載的<<運算符不適用於指向Component對象的指針。

我不知道我怎麼會影響這樣的事情會被每一個派生類的<<運營商來覆蓋,所以我可以做類似純虛函數:

Component* mobo = new MotherBoard(); 

cout << *mobo << endl; 

delete mobo; 

還涉及:overloading << operators and inherited classes

回答

5

也許這樣的事情:

#include <iostream> 

class Component 
{ 
public: 
    // Constructor, destructor and other stuff 

    virtual std::ostream &output(std::ostream &os) const 
     { os << "Generic component\n"; return os; } 
}; 

class MotherBoard : public Component 
{ 
public: 
    // Constructor, destructor and other stuff 

    virtual std::ostream &output(std::ostream &os) const 
     { os << "Motherboard\n"; return os; } 
}; 

std::ostream &operator<<(std::ostream &os, const Component &component) 
{ 
    return component.output(os); 
} 

int main() 
{ 
    MotherBoard mb; 
    Component &component = mb; 

    std::cout << component; 
} 
+0

+1我已經看過幾次,這是有道理的。但是,鑑於'output'是公開的,'operator <<'不必是朋友(也不應該)。另外,在過去,我已經看到簽名爲:'virtual std :: ostream&print(std :: ostream&out)const;'以便可以在手動調用時進行鏈接:'myobj.output(std :: cout)< 2012-02-10 13:39:19

+0

@DavidRodríguez-dribeas你是對的,朋友宣言是不需要的,只是我猜想的一種習慣的力量。 :)根據您的建議更新代碼。 – 2012-02-10 13:44:03