Если мы имеем следующий код:Безопасность указателя arithmatic на унаследованных объектов
struct Base
{
int x;
int y;
void foo();
virtual unsigned getCrc() = 0;
};
struct Derived1 : public Base
{
int a;
int b;
unsigned getCrc();
};
struct Derived2 : public Base
{
float a;
float b;
unsigned getCrc();
};
Является ли это C++ стандарт, который a
и b
должны быть после x
и y
в памяти? Или это самый используемый метод для наследования унаследованных возражений? (т. е. дефакто-стандарт компилятора).
Другими словами, я могу гарантировать, что:
Derived1 obj;
int* unsafe_internal_a = (int*)((unsigned)(&obj) + sizeof(Base));
EDIT: Мой вопрос «покрыта ли распределение памяти в некоторых стандартных? Или это зависит от компилятора? '. Код просто для иллюстрации.
AFAIK, 'a' и' b' всегда будут после 'x' и' y', но могут быть добавлены байты добавления, куда выбирает компилятор. –
Порядок членов в структуре или классе сохраняется, но между ними может быть добавлено дополнение. – 2013-02-10 15:00:01
Вы получаете правильное значение _a_? Разве _Derived1_ должен также иметь указатель на vtable? – Zlatomir