Размер наследования C ++ с пустым объектом производного класса - PullRequest
0 голосов
/ 31 августа 2018
#include<iostream>
using namespace std;
class base {
 int arr[10];
};
class b1: public base { };

class b2: public base { };

class derived: public b1, public b2 {};

int main(void)
{
    cout << sizeof(derived);
    return 0;
}

Поскольку в c ++ по умолчанию члены класса являются закрытыми, почему размер производного класса равен 80.

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Спецификатор доступа private относится только к доступности членов базового класса в производном классе. Производный класс содержит подобъекты классов, из которых он наследуется. В этом случае он содержит b1 и b2 подобъектов. Таким образом, его размер является суммой обоих их размеров.

0 голосов
/ 31 августа 2018

Ваша аргументация неверна. Конфиденциальность не имеет ничего общего с sizeof классом.

Рассмотрим этот пример:

class base {
    int value = 42;
public:
    int get() { return value; } 
};

class derived : public base {};

derived наследует get, у него нет (прямого) доступа к value, но, конечно, в экземпляре derived есть член value. Вы можете легко убедить себя, позвонив get() на derived;)

0 голосов
/ 31 августа 2018

derived наследует как b1, так и b2, поэтому его размер является, по крайней мере, суммой их размеров, каждый из которых имеет размер не менее десяти int с, 40 байтов с 32-битным int s. Что дает нам как минимум 80. Видимость члена здесь не имеет значения, она не влияет на размер шрифта. По-видимому, нельзя оптимизировать массивы для derived, так как публично base (в два раза!) Должно содержать ровно столько же подобъектов типа base, иначе как бы вы повысили его до base?

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