На это уже был дан ответ в нескольких других ответах: спецификаторы доступа ограничивают доступ , но атрибуты-члены класса все еще наследуются.
Я просто хотел предоставить обоснование,как я обычно учусь лучше, когда вижу причины для этого.В основном, когда вы наследуете от типа, производный тип содержит подобъект базового типа, такого же маленького или большого, как базовый.Причиной необходимости всех переменных-членов является то, что производный объект является базовым объектом, и для него могут быть вызваны функции-члены базового уровня.Даже если производный тип не может получить доступ к атрибуту закрытого члена, базовые методы, которые могут быть вызваны для этого объекта, могут все еще нуждаться в доступе к нему, поэтому члены должны быть там:
class base {
int x;
public:
base() : x(0) {}
// ...
void printout() {
std::cout << x << std::endl;
}
};
class derived : public base {
// ... assume that derived does not hide `printout`
};
int main() {
derived d;
d.printout(); // this requires access to d.base::x
}
Это всего лишь простойпример, и есть несколько вещей, которые вы можете здесь сказать, чтобы доказать, что в некоторых случаях x
можно сделать ненужным (мы переопределяем / скрываем printout
в производном объекте ...), ноязык по-прежнему позволяет вам получить доступ к скрытому / переопределенному методу-члену путем квалификации, поэтому d.base::printout()
все равно будет обращаться к printout
на базовом уровне, а для этого по очереди требуется x
.