我已经覆盖了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;,但std::flush操纵器不会调用覆盖的CMyStream::flush()或CMyStream::sync()函数。如果我进行调试,我会看到调用的是默认的std::ostream::flush(),而不是我的覆盖函数。
有没有办法解决这个问题,或者我必须直接调用myStream.flush()而不是通过操纵器?
发布于 2014-07-29 23:35:31
问题是std::ostream::flush方法不是虚拟的,所以您不能正确地覆盖它,您也不应该这样做。相反,您应该创建自己的buffer类,该类继承自std::basic_streambuf、std::basic_filebuf或std::basic_stringbuf,并覆盖其中受保护的int sync()方法。然后你的流类应该在它的构造函数中创建合适的buffer类型。
https://stackoverflow.com/questions/25019067
复制相似问题