Многие вопросы говорят о POD; Но все вопросы говорят о полной копии объекта. Могу ли я применить ту же концепцию к простой старой части данных класса. Пример:
struct Parent1
{
int x;
float y;
};
struct Parent2
{
int k;
float l;
};
struct NotPod : public Parent1, public Parent2
{
char z;
short w;
};
NotPod a, b;
void func()
{
a.z = '4';
a.w = 345;
memcpy((char*)&b.z, (char*)&a.z, (char*)(&a.w)-(&a.z) + sizeof(a.w));
}
Я спрашиваю о старом C ++ (не C ++ 11).
Как я понял из вашего примера кода, ваш вопрос не о POD. Что вам нужно, так это гарантия того, что члены вашего самого производного класса являются агрегатами и имеют непрерывную структуру памяти.
См. 9.2.12 (ISO 14882: 2003).
Нестатические члены данных (не объединяющего) класса, объявленного без промежуточного спецификатора доступа, распределяются
так что более поздние члены имеют более высокие адреса в объекте класса. Порядок выделения нестатических
члены данных, разделенные спецификатором доступа, не определены (11.1).
Проще говоря, не ставьте public
/protected
/private
Получите доступ к спецификаторам между вашей последовательностью агрегатов, и вы получите такую гарантию.
Таким образом, вы хотите скопировать только элементы родительской части в структуре.
Если да, то почему бы не реализовать как в func3 ()?
void func2()
{
a.z = '7';
a.w = 444;
a.x = 4;
a.y = 2.1;
memcpy(&b, &a, sizeof(NotPod)); // copies all the members
}
void func3()
{
a.z = '7';
a.w = 444;
a.x = 4;
a.y = 2.1;
memcpy(&b, &a, sizeof(Parent)); // copies only the members of the Parent
}
Как вы сами сказали, это не POD в C ++ 03. Части этого (Parent1 и Parent2), но вы хотите рассматривать остальное как POD. Ну, просто сделай остальное POD. Либо путем определения локальной структуры
struct NotPod : public Parent1, public Parent2
{
struct InternalPod
{
char z;
short w;
};
InternalPod i;
};
или путем наследования от третьей структуры:
struct InternalPod
{
char z;
short w;
};
struct NotPod : public Parent1, public Parent2, public InternalPod
{
};