C++ C++;继承运算符<&书信电报;

C++ C++;继承运算符<&书信电报;,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,我有几个对象(类),它们都继承自基类结构。这些对象的打印方式都不同,因为它们具有不同的成员变量,但共享相同的函数 我希望能够有一个结构列表,并打印它们,而不必将它们转换回特定的对象,即:结构->建筑 这是否可能在C++?< /p> class Structure { }; class Building : public Structure { public: friend std::ostream& operator<<(std::ostream& o,

我有几个对象(类),它们都继承自基类结构。这些对象的打印方式都不同,因为它们具有不同的成员变量,但共享相同的函数

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

这是否可能在C++?< /p>

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;
类结构
{
};
班级建筑:公共建筑
{
公众:

friend std::ostream&operator创建一个虚拟输出函数并在
操作符中调用它创建一个虚拟输出函数并在
操作符中调用它你可能是指
Structure*struct
,而不是
Structure-struct*
?@zenith将编译?:)不要使用struct作为变量名,因为它是reserved word。@NeilKirk不是真的。@NeilKirk你能看看我的更新吗。我进一步继承了Building/Res像类,但打印会导致附加一个随机地址。你可能是指
Structure*struct
,而不是
Structure-struct*
?@zenith将编译?:)不要使用struct作为变量名,因为它是保留字。@NeilKirk不太清楚。@NeilKirk你能看一下我的更新吗。我进一步继承了Building/Restation类,但打印会导致附加一个随机地址。@critikull4在一般情况下,这些都是简单的例子,特别是对于这类应用,非常有用的工具“基类定义算法功能,子类定义实现”问题。@critikull4它应该
返回c.output(o);
@critikull4在一般情况下,这些都是简单的例子,特别是对于这类问题,非常有用的工具基类定义算法功能,子类定义实现“问题”。@critikull4它应该
返回c.output(o);
CORRECT_VALUE<random address>
8.8.8.80x804c504
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;
}