首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++继承operator<<

C++继承operator<<
EN

Stack Overflow用户
提问于 2015-03-18 18:27:26
回答 1查看 84关注 0票数 1

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

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

这在C++中是可能的吗?

代码语言:javascript
复制
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)。问题是,我正在使用进一步的继承,我的命令的输出是:

代码语言:javascript
复制
CORRECT_VALUE<random address>
8.8.8.80x804c504

我不知道它为什么会附加那个随机地址?

http://pastebin.com/81ubU0yX

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-18 18:31:43

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

代码语言:javascript
复制
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;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29129907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档