ReaderIface.hpp =============== class ReaderIface { public: // All existing code from ReaderIface virtual const char* const* getExt() = 0; }; WriteerIface.hpp =============== class WriterIface { public: // All existing code from WriterIface virtual const char* const* getExt() = 0; }; IoVtk.hpp ========= class IoVtk { public: IoVtk(); virtual ~IoVtk(); static const char* const* getExtS() { return IoVtk::sfx; } static const char* getDescr() { return IoVtk::desc; } static const char* getFormat() { return IoVtk::format; } const char* const* getExt(); private: static const char* sfx[]; static const char* desc; static const char* format; }; IoVtk.cpp ========= #include "IoVtk.h" const char* IoVtk::sfx[] = { "vtk", 0 }; const char* IoVtk::desc = "Kitware VTK"; const char* IoVtk::format = "VTK"; const char* const* IoVtk::getExt() { return IoVtk::sfx; } ReadVtk.hpp =========== class ReadVtk: public ReaderIface, public IoVtk { public: // All existing code from ReadVtk const char* const* getExt() { return this->IoVtk::getExt(); } }; ReadVtk.cpp =========== No changes WriteVtk.hpp ============ class WriteVtk: public WriterIface, public IoVtk { public: // All existing code from WriteVtk const char* const* getExt() { return this->IoVtk::getExt(); } }; WriteVtk.cpp ============ No changes