我已经覆盖了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 called\n";
return (*this);
}
int sync()
{
std::cout << "Overridden sync called\n";
return 0; // Success
}
};
我试着像这样使用它:
CMyStream myStream;
myStream << "Test" << std::flush;
,但被覆盖的CMyStream::flush()
或CMyStream::sync()
函数未被std::flush
操纵符调用。如果我调试,我看到默认的std::ostream::flush()
被调用,而不是我的覆盖函数。
是否有解决此问题的方法,或者我是否必须直接调用myStream.flush()
而不是操纵器?
答案 0 :(得分:3)
问题是std::ostream::flush
方法不是虚拟的,所以你不能正确地覆盖它,你不应该。你应该做的是创建自己的缓冲类,继承自std::basic_streambuf
或std::basic_filebuf
或std::basic_stringbuf
并覆盖受保护的int sync()
方法。然后你的流类应该在它的构造函数中创建适当的缓冲区类型。