2016-01-17 23 views
2

Скажем, у меня есть два класса А и В, как показано ниже:класс: размер объекта производного класса

class A { 
    void function1() { 
     cout<<"hello"; 
    } 
    int member1; 
public: 
    char member2; 
}; 

class B : public A 
{ 
    int member3; 
    void function2() { 
     cout<<"Hello to you too"; 
    } 
public: 
    float member4; 
}; 

Теперь, если я создаю объект класса B, каким будет размер объекта? Будет ли то же самое, даже если наследование класса А является частным или защищенным?

+1

ясно, что размер объекта будет другим. – Mox

+0

У вас есть ошибка компиляции 'float member 4;' –

ответ

2

sizeof для всех типов в C++ (кроме char типов, для которых sizeof дает 1 по определению) определяется реализацией.

Как правило, вы не ожидаете, что производный класс будет меньше базового класса. Но разница - если есть - зависит от компилятора, выравнивание элементов, то, как компилятор управляет заполнением, чтобы обеспечить соответствие элементов разного размера (и типов классов) и т. Д.

Я обычно не ожидал доступ (public, protected, private), чтобы напрямую влиять на размер типа класса. Компилятор может выбрать сохранение элементов в другом порядке, в зависимости от их доступа, или, возможно, нет. Таким образом, размер может измениться или не измениться, но разные компиляторы могут делать что-то по-другому. В принципе, однако, компилятор не нуждается в изменении размера типа класса просто из-за изменения доступа некоторых членов или наследования.

0

Размер объекта класса B будет представлять собой размер объекта класса A плюс объем памяти, получаемый дополнительными членами данных, добавляемыми классом B. Методы не учитываются, поэтому вы можете добавлять столько методов, сколько хотите, без увеличения размера объектов.

+0

Так что независимо от режима видимости можно ожидать, что размер объекта класса B будет представлять собой сумму размеров элементов данных в A и B вправо? – ShankRam

0

Это зависит от компилятора, поскольку в этом есть определенная степень свободы. Мое дикое непроверенное предположение заключается в том, что, например, в общей системе x86 A должно быть целым числом (4 байта) и B в качестве одного и того же плюс два других целых числа (всего 8 байтов).

Причина заключается в том, что процессоры, как выровненные данные так что int + char класс будет выделен в качестве int + char + 3-byte-padding сделать массив из этих классов, чтобы все int S правильно выровнены по адресам, которые кратны 4.

int и float имеют одинаковый размер на x86, так что здесь находятся два дополнительных int s из-за B.

Учитывая, что виртуальных функций нет, никакие другие данные не нужны на каждый экземпляр, так как вся диспетчеризация будет определена во время компиляции.

Частные/общедоступные/защищенные только логические стены, которые применяются во время компиляции и не требуют дополнительного хранения во время выполнения.

0

private, protected или public Наследование не имеет никакого отношения к размеру. Они влияют только на видимость базовых элементов во внешнем коде.

Смежные вопросы