Просто небольшой фон для странного вопроса: у меня есть сетевое фреймворк (RTI DDS), который имеет функцию сериализации C, которая берет указатель и преобразует структуру C в строку.
Он также (и также предназначен для работы) с классами C ++. Но если я сделаю полиморфный класс C ++, добавив виртуальную функцию, эта функция сериализации с ошибками или, что еще хуже, даст неправильный вывод.
Я предполагаю, что это внутренне делает предположения о структуре памяти структуры.
Можно ли получить необработанный указатель C из полиморфного объекта C ++?
Я знаю, что я мог бы просто создать каждую структуру дважды, один раз полиморфный и один раз неполиморфный, но это привело бы к безумному количеству связующего кода.
В настоящее время у меня нет идей.
Некоторая техническая справка: функция C находится в пакете Source DDS:
DynamicData.c DDS_ReturnCode_t DDS_DynamicData_to_cdr_buffer (…) {..
Вы можете добавить не виртуальную базу struct
содержащий только данные:
struct DataXYBase {
int data1;
double data2;
};
class VirtualBaseClass : public DataXYBase {
virtual void Function1();
};
class DerivedClass : public VirtualBaseClass {
virtual void Function1();
};
а затем приведен к DataXYBase
перед передачей его в функцию сериализации.
Я думаю, вам следует связать все данные в структурах POD (которые, вероятно, могут наследоваться друг от друга) и все средства доступа / логику в полиморфных классах, которые содержат структуры данных либо как члены (или, возможно, даже через наследование). Вы бы сериализовали только часть данных и предоставили бы тривиальные конструкторы для ваших полиморфных классов из структуры данных.
Это должно ограничить количество необходимого клея и при этом сохранить желаемый полиморфизм в вашем коде.