重写std::ostream flush()函数,不被std::flush调用

Overridden std::ostream flush() function not called by std::flush

本文关键字:std flush 不被 调用 函数 ostream 重写      更新时间:2023-10-16

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

#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 calledn"; 
            return (*this);
        }
        int sync()
        {
            std::cout << "Overridden sync calledn";
            return 0;   // Success
        }
};

我试着这样使用它:

CMyStream myStream;
myStream << "Test" << std::flush;

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

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

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