C++ 继承运算符<<

C++ Inheritance operator<<

我有一些对象(classes)都是从基础 class 结构继承的。这些对象都有不同的打印方式,因为它们具有不同的成员变量但共享共同的功能。

我希望能够有一个结构列表并打印它们,而不必将它们转换回它们的特定对象,即:结构 -> 建筑。

这在 C++ 中可行吗?

class Structure
{

};

class Building : public Structure
{
public:
    friend std::ostream& operator<<(std::ostream& o, const Building &b)
    {
        return o << b.m_windows.size() << b.m_doors.size();
    }
protected:
    Windows m_windows;
    Doors m_doors;
};

class Statue : public Structure
{
public:
    friend std::ostream& operator<<(std::ostream& o, const Statue &s)
    {
        return o << s.m_type;
    }
protected:
    StatueType m_type;
};

int main(int argc, char* argv[])
{
    Structure struct* = new Building();
    std::cout << struct << std::endl;
    return 0;
}

Error:
error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
     std::cout << struct << std::endl;

编辑:

我已经在我自己的代码中隔离了这个问题,这里是一个可编译的版本 (C11)。问题是我正在使用进一步的继承,我的命令输出是:

CORRECT_VALUE<random address>
8.8.8.80x804c504

我不确定为什么要附加那个随机地址?

http://pastebin.com/81ubU0yX

创建一个虚拟输出函数并在 operator << 中调用它。在派生的 类.

中覆盖此输出函数
class Structure
{
public:
    virtual ~Structure() {}
    virtual std::ostream& StreamOut(std::ostream& o) const { return o; }

    friend std::ostream& operator<<(std::ostream& o, const Structure &s)
    {
        return s.StreamOut(o);
    }
};

class Building : public Structure
{
public:
    virtual std::ostream& StreamOut(std::ostream& o) const
    {
        return o << m_windows.size() << m_doors.size();
    }
protected:
    Windows m_windows;
    Doors m_doors;
};

class Statue : public Structure
{
public:
    virtual std::ostream& StreamOut(std::ostream& o) const
    {
        return o << m_type;
    }
protected:
    StatueType m_type;
};

int main(int argc, char* argv[])
{
    std::unique_ptr<Structure> myStruct(new Building());
    std::cout << *myStruct << std::endl;
}