2012-02-10 65 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