Работая над устаревшим проектером, я столкнулся со следующей закономерностью: структура POD используется для передачи данных по сети.
struct PODType {
// some data
int data;
};
На стороне получателя данные принимаются в объект типа POD. Позже класс является производным от PODType, и полученный объект приводится с помощью приведения в стиле C в производный класс, чтобы использовать некоторые методы для доступа к данным.
class DerivedFromPOD: public PODType {
public:
// some methods
int f(int x) {return data+x;}
protected:
// some methods
};
PODType pod;
receive(&pod);
DerivedFromPOD* d = (DerivedFromPOD*)&pod;
int i = d->f(10);
Производный класс имеет общедоступные и защищенные методы, поэтому он больше не является POD. Я знаю, что это злоупотребление наследованием, но оно уже давно присутствует в кодовой базе.
Мне интересно, гарантированно ли это работает со стандартной точки зрения (С++ 03 или С++ 98). Производный класс не имеет собственных элементов данных или виртуальных функций, но я не уверен, гарантирует ли он идентичность макета памяти, учитывая, что один POD, а другой нет. Компилятор вынужден организовать DerivedFromPOD таким образом, чтобы адрес d.data
был идентичен адресу объекта d типа DerivedFromPOD, как для базового класса POD?
PODType
, иDerivedFromPOD
являются POD в C++11. - person dyp   schedule 13.05.2014