В зависимости от того, что вы планируете делать с этими структурами, вы можете сделать это без дополнительных затрат на vtable, например:
struct HDR {
unsigned short msgType;
unsigned short msgLen;
};
struct Msg1: HDR {
char text[20];
friend ostream& operator<< (ostream& out, const Msg1& msg);
};
struct Msg2: HDR {
uint32_t c1;
uint32_t c2;
friend ostream& operator<< (ostream& out, const Msg2& msg);
};
Поскольку в базовом классе нет виртуальных функций, вы не получите vtable для этих объектов. Однако вы должны знать, что это означает, что если у вас есть указатель HDR
, указывающий на произвольный подкласс, вы не сможете его распечатать, поскольку неясно, какую функцию operator<<
вызвать.
Я думаю, что здесь может быть более фундаментальная проблема. Если вы пытаетесь обрабатывать все эти объекты единообразно с помощью базового указателя, но хотите иметь возможность распечатать их все, тогда вам понадобится нажать на память, чтобы пометить каждый объект. Вы можете либо пометить их неявно с помощью vtable, либо явно, добавив свою собственную информацию о типе. Там действительно нет хорошего способа обойти это.
Если, с другой стороны, вы просто хотите упростить свою логику, включив элементы данных в базовый класс, тогда этот подход должен работать.