Non virtual methods of basic_istream after upcasting to base reference

33 Views Asked by At

I have a set of classes that derive from basic_istream and ios_base like

  • std::stringstream,
  • boost::interprocess::basic_vectorstream,
  • boost::interprocess::bufferstream

At some point all those instances need to dump their content (emulated in the example below with a simple printf):

#include <iostream>
#include <sstream>

void dump(std::basic_istream<char> &input)
{
    const int chunk_size = 10;
    char chars[chunk_size];
    
    while (!input.eof()) {
        input.read(chars, chunk_size);
        int nread = input.gcount();
      
        printf("CHUNK: %.*s\n", nread, chars);
    }
}

int main()
{
    std::stringstream ss;
    ss << "Add some content. ";
    ss << "And then some more." << "... and that's it";
    
    foo(ss);
}

Demo

Since all is needed for the dump function is eof, read and gcount, a reference to the base class is passed to dump, so I'm assuming:

  1. All three methods are non virtual so the correct thing is called with all the needed state.
  2. There is no memory corruption implications (tried to verify by compiling the demo above with address sanitizer).

Are these assumptions correct and is there a case they'd break down?

I need to scale this logic for multiple other stream classes that are available in the codebase so the only red flag I can find is when a class redefines any of those methods, which would cause the reference to base class to break expectations.

0

There are 0 best solutions below