I've been googling around and I just can't find a simple answer to this. And it should be simple, as the STL generally is.
I want to define MyOStream which inherits publicly from std::ostream. Let's say I want to call foo() each time something is written into my stream.
class MyOStream : public ostream {
public:
...
private:
void foo() { ... }
}
I understand that the public interface of ostream is non-virtual, so how can it be done?
I want clients to be able to use both operator<< and write() and put() on MyOStream and have use the extended ability of my class.
Best Answer
I was spinning my head around how to do the same thing and i found out it's actually not that hard. Basically just subclass the ostream and the streambuf objects, and construct the ostream with itself as the buffer. the virtual overflow() from std::streambuf will be called for every character sent to the stream. To fit your example i just made a foo() function and called it.
EDIT: The old code used the wrong initialization order. Although it had no visible side effects, the streambuf object should be initialized before passing it to the ostream object. Since C++ initializes parents left to right, I moved std::streambuf to the left to make the code correct.
EDIT: I changed the code to inherit std::streambuf privately to keep the interface cleaner and keep the class encapsulated.