Преобразовать полиморфный объект C ++ в неполиморфный объект C

Просто небольшой фон для странного вопроса: у меня есть сетевое фреймворк (RTI DDS), который имеет функцию сериализации C, которая берет указатель и преобразует структуру C в строку.

Он также (и также предназначен для работы) с классами C ++. Но если я сделаю полиморфный класс C ++, добавив виртуальную функцию, эта функция сериализации с ошибками или, что еще хуже, даст неправильный вывод.

Я предполагаю, что это внутренне делает предположения о структуре памяти структуры.

Можно ли получить необработанный указатель C из полиморфного объекта C ++?

Я знаю, что я мог бы просто создать каждую структуру дважды, один раз полиморфный и один раз неполиморфный, но это привело бы к безумному количеству связующего кода.

В настоящее время у меня нет идей.

Некоторая техническая справка: функция C находится в пакете Source DDS:

DynamicData.c DDS_ReturnCode_t DDS_DynamicData_to_cdr_buffer (…) {..

3

Решение

Вы можете добавить не виртуальную базу struct содержащий только данные:

struct DataXYBase {
int data1;
double data2;
};

class VirtualBaseClass : public DataXYBase {
virtual void Function1();
};

class DerivedClass : public VirtualBaseClass {
virtual void Function1();
};

а затем приведен к DataXYBase перед передачей его в функцию сериализации.

4

Другие решения

Я думаю, вам следует связать все данные в структурах POD (которые, вероятно, могут наследоваться друг от друга) и все средства доступа / логику в полиморфных классах, которые содержат структуры данных либо как члены (или, возможно, даже через наследование). Вы бы сериализовали только часть данных и предоставили бы тривиальные конструкторы для ваших полиморфных классов из структуры данных.

Это должно ограничить количество необходимого клея и при этом сохранить желаемый полиморфизм в вашем коде.

3

По вопросам рекламы [email protected]