Я читаю - 3.4 Наследование и член данных. В нем говорится «языковая гарантия целостности подобъекта базового класса в производном классе». Кроме того, это дает пример следующим образом:Объектная модель C++ по gcc 4.4.7: дополнение субобъектов базового класса, занятое в объекте производного класса
class Concrete1
{
private:
int val;
char bit1;
};
class Concrete2 : public Concrete1
{
private:
char bit2;
};
class Concrete3 : public Concrete2
{
private:
char bit3;
};
объектная модель Concrete1 является:
4 bytes for val,
1 byte for bit1,
3 bytes padding.
// 8 bytes in total.
объектная модель Concrete2 является:
8 bytes for Concrete1 subobject,
1 byte for bit2,
3 bytes padding.
// 12 bytes in total.
Аналогичным образом, модель объекта Concrete3 составляет 16 байтов ,
Объект-участник Concrete2 bit2 не использует дополняющую часть субобъекта Concrete1, поэтому он составляет 12 байтов. Но когда я попробовал пример в gcc 4.4.7, объект Concrete2 и объект Concrete3 имеют тот же размер, что и объект Concrete1 - 8 байт. Поэтому я предполагаю, что gcc использует дополняющую часть объекта Concrete1 для хранения бит2 и бит3. Я называю их «не-использование-padding» и «use-padding» для краткости.
Для того, чтобы объяснить, почему обивка часть не используется, книга дает следующий код:
Concrete2 *pc2;
Concrete1 *pc1_1, *pc2_2;
pc1_1 = pc2;
*pc1_1 = *pc2_2; // pc1_1 may point to a Concrete2 or Concrete3 object.
В «не потребительной отступа» способом, объект Concrete1 указывает pc2_2 будут скопированы к подобъекту Concrete1 объекта Concrete2/Concrete3, на который указывает pc1_1. В книге также говорится, что это «членная» копия, но она больше похожа на копию «объекта», так как она также копирует часть дополнений.
В книге «use-padding» в книге говорится, что он переопределит элемент bit2, потому что соответствующий байт * pc2_2 является байтом заполнения. Опять же, я попробовал это с gcc 4.4.7, оказалось, что элемент bit2 не переопределен. Поэтому я предполагаю, что копия является реальной копией «по порядку», скопированы только val и бит1.
Итак, мои вопросы: 1. Я правильно отношусь к действиям gcc: «use-padding» и реальная копия «по порядку»? 2. Частные члены базового класса не могут быть доступны в производном классе, но объект производного класса содержит все частные члены в подобъекте базового класса (val и бит1) в объектной модели. Почему он предназначен для размещения закрытых членов базового класса, даже если их невозможно получить в объекте производного класса? Просто для операций копирования, таких как * pc1_1 = * pc2_2; ?
Благодаря
# 2: Обычно класс будет иметь функции открытого члена, которые, в свою очередь, используют частные данные. Даже если производный класс не может получить доступ к своим частным членам своего базового класса, он может, безусловно, вызвать его общедоступные методы. –
Вы хотите прочитать C++ Itanium ABI, который описывает (часть) макет, используемый gcc. В частности, это показывает, что если вы замените 'private:' на 'public:' в Concrete1, размер производных классов изменится. –