При реализации наследования элементы данных из нескольких уровней расположены последовательно? - PullRequest
2 голосов
/ 06 марта 2012

Мне интересно, или члены класса данных из нескольких уровней наследования расположены последовательно в компиляторах C ++.Например, если у меня есть следующие классы:

class Base
{
 public:
   int a;
};

class child_1 : public Base
{
 public:
   int b;
};

class child_2 : public child_1
{
 public:
   int c;
}

Будет ли следующая операция выполняться и выводить то, что ожидается на всех компиляторах?

child_2 my_obj;

my_obj.a = 3; my_obj.b = 2; my_obj.c = 1;

Base* base_ptr = (Base*)&my_obj;
int* int_ptr = (int*)base_ptr;

cout << "Output 3: " << *int_ptr << endl
     << "Output 2: " << *(int_ptr + 1) << endl;
     << "Output 1: " << *(int_ptr + 2) << endl;

Кроме того, если это возможно, могу ли яВам нужно промежуточное приведение от типа child_2 * к типу Base *, как я описал выше, или допустимо ли следующее:

int* int_ptr (int*)&my_obj;

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

Компилятор, с которым я специально работаю, это VC ++ 2005.

1 Ответ

3 голосов
/ 06 марта 2012

Нет, относительное расположение членов производного класса и членов базового класса не указано.

В текущем стандарте класс является только стандартным макетом , если среди другихусловия, это:

либо не имеет нестатических элементов данных в наиболее производном классе и не более одного базового класса с нестатическими элементами данных, или не имеет базовых классов с нестатическими элементами данных

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

Ваш код зависит от того, как конкретный компилятор размещает базовые классы, и не является переносимым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...