Задать вопрос
Daniro_San
@Daniro_San
Программист

Неявное наследование private ?!?

Просто оставлю код:
# include < iostream >

class Base {
private:
            int Var = 475 ;
public:
            virtual int Get() const final {
                 return Var;
            }
};

class Two : public Base {} ;

int main () {

     Two two;
     std :: cout << two . Get () ; /// 475, но как  ?
     std :: cin . get () ;

}
  • Вопрос задан
  • 851 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 2
zagayevskiy
@zagayevskiy
Android developer at Yandex
А что в этом такого? Вы сделали виртуальный метод с реализацией. Затем унаследовали класс, не переопределив метод. Метод публичный. То, что он внутри обращается к приватным полям - без разницы. Приватные поля содержатся в наследнике, просто они ему не доступны.
Ответ написан
Комментировать
Nipheris
@Nipheris Куратор тега C++
Вы невнимательно читали про наследование (или читали в плохом источнике).

Логически (т.е. с точки зрения самой идеи) наследование (причем, любое, public и другие) подразумевает, что реализация базового класса станет частью реализации дочернего. Приватные поля класса - это часть его реализации.

Технически, наследование в C++ подразумевает наличие подобъекта базового класса в объекте класса-наследника. Т.е. у вас в каждый объект Two помимо его собственных полей (в вашем примере их нет) запихиваются все поля Base (и так с каждым базовым классом, если их несколько), по принципу матрешки. НЕВАЖНО, как указали уже в первом ответе, что вы не имеете к ним доступ из класса-наследника. Важно, что они есть, и методы класса Base могут ими спокойно пользоваться, чтобы выполнять свою работу.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Да, всё верно, в этом и прелесть наследования
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы