首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写的std::ostream flush()函数未被std::flush调用

重写的std::ostream flush()函数未被std::flush调用
EN

Stack Overflow用户
提问于 2014-07-29 23:25:12
回答 1查看 894关注 0票数 2

我已经覆盖了std::ostream::flush()函数。下面我从示例中删除了所有其他代码:

代码语言:javascript
复制
#include <iostream>
#include <ostream>

class CMyStream : public std::streambuf, public std::ostream
{
    public:
        explicit CMyStream() throw() : std::ostream(this)
        {
            // Intentionally empty block
        }

        std::ostream &flush() 
        { 
            std::cout << "Overridden flush called\n"; 
            return (*this);
        }

        int sync()
        {
            std::cout << "Overridden sync called\n";
            return 0;   // Success
        }

};

我试着这样使用它:

代码语言:javascript
复制
CMyStream myStream;
myStream << "Test" << std::flush;

,但std::flush操纵器不会调用覆盖的CMyStream::flush()CMyStream::sync()函数。如果我进行调试,我会看到调用的是默认的std::ostream::flush(),而不是我的覆盖函数。

有没有办法解决这个问题,或者我必须直接调用myStream.flush()而不是通过操纵器?

EN

回答 1

Stack Overflow用户

发布于 2014-07-29 23:35:31

问题是std::ostream::flush方法不是虚拟的,所以您不能正确地覆盖它,您也不应该这样做。相反,您应该创建自己的buffer类,该类继承自std::basic_streambufstd::basic_filebufstd::basic_stringbuf,并覆盖其中受保护的int sync()方法。然后你的流类应该在它的构造函数中创建合适的buffer类型。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25019067

复制
相关文章

相似问题

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