Наследование и размер объекта - PullRequest
0 голосов
/ 11 января 2012

Я предполагаю, что в моем базовом классе есть один член типа int, а в производном классе также есть один член типа int.Теперь, когда я создаю один объект производного класса и вижу выходные данные по sizeof (производный класс-объект), он становится равным 8. Теперь я пытаюсь понять основную идею здесь.

Я знаю, что когда я создаю объект для производного класса, то и конструктор базового класса, и конструктор производного класса вызываются.Единственная цель конструктора базового класса - инициализация членов данных базового класса.Я ожидал, что sizeof отобразит 4, потому что меня интересует только создание объекта производного класса.Но вместо этого я получаю вывод как «8».Итак, дополнительные 4 байта выделяются, и я думаю, что это происходит для конструктора базового класса.Я был бы признателен, если бы кто-нибудь помог мне понять следующие понятия:

  • Почему выделяется 8 байтов вместо 4 при создании объекта производного класса?Означает ли это, что конструктор базового класса также создает новый объект базового класса и объединяет его с новым объектом производного класса?

Я просто создаю один объект производного класса, а размер этого объекта производного класса: sizeof (baseClassObject) + sizeof (производный класс-объект).Буду очень признательна за помощь.

Ответы [ 2 ]

3 голосов
/ 11 января 2012

В общем случае inheritance в oop означает, что объект производного класса также является объектом базового класса. Поэтому он содержит все содержащиеся в базовом классе (в данном случае один int, то есть 4 байта) и любые дополнительные члены-данные из производного класса (так, еще один int).

Если бы это было не так, как бы объект производного класса можно было использовать в качестве объекта базового класса? Унаследованные методы, скорее всего, будут делать ужасные вещи, поскольку члены данных, к которым они пытаются получить доступ, не будут существовать.

Следовательно, sizeof(derivedClass)==sizeof(baseClass) + sizeof(int) (хотя ничто не мешает компилятору сделать его больше).

Если вы не хотите, чтобы ваш derivedClass мог использоваться как baseClass, вы не должны извлекать из него

.
2 голосов
/ 11 января 2012

Предположим, у вас есть два класса, как показано ниже

class Car {
    int make;
public:
    Car(int m): make(m) {}
    int getMake() { return make; }    
};

class Audi : public Car{
    int internalID;
public:
    Audi(int m, int id): Car(m), internalID(id){}
    int getInternalID() { return internalID; }
};

Теперь я иду вперед и создаю объект Audi

Audi *myCar = new Audi(2012 /*make*/, 216487 /*internal ID*/);

вы можете сделать что-то вроде

myCar->getInternalID(); //returns 216487
myCar->getMake(); //returns 2012

Если ваше предположение, что создание производного класса должно выделять пространство только для производных членов, где в этом случае будет храниться «make»?

Производный класс - это не что иное, как базовый класс + члены, объявленные в производном классе. Следовательно, ваш производный объект будет выглядеть примерно так в памяти

------------
| make      |
------------
| internalID|
-------------

Следовательно, вы получите размер производных членов класса плюс размер базового класса. Опять же, размер базового класса будет размером членов базового класса плюс размер его базового класса. Надеюсь, это поможет!

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