Докато работех върху наследен проектор, се натъкнах на следния модел: 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. Знам, че това е злоупотреба с наследяване, но това е в кодовата база от дълго време.
Чудя се дали това е гарантирано да работи от стандартна гледна точка (C++03 или C++98). Произведеният клас няма собствени членове на данни или виртуални функции, но не съм сигурен дали гарантира, че оформлението на паметта е идентично, като се има предвид, че единият е POD, а другият не. Компилаторът принуден ли е да подреди DerivedFromPOD така, че адресът на d.data
да е идентичен с адреса на обект d от тип DerivedFromPOD, както е за основния клас POD?
PODType
, иDerivedFromPOD
са POD в C++11. - person dyp   schedule 13.05.2014