Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
1

механизм наследования

04.07.2016, 10:55. Просмотров 880. Ответов 6
Метки нет (Все метки)

Есть такой код:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
 
class base {
protected:
  int i, j; // private to base, but accessible to derived
public:
  void set(int a, int b) { i = a; j = b; }
  void show() { cout << i << " " << j << "\n"; }
};
 
class derived : public base {
  int k;
public:
  // derived may access base's i and j
  void setk() { k = i*j; }
 
  void showk() { cout << k << "\n"; }
};
 
int main()
{
  derived object1;
 
  object1.set(2, 3); // OK, known to derived
  object1.show();    // OK, known to derived
 
  object1.setk();
  object1.showk();
 
  return 0;
}
Я его надыбал в книжке Шилдта С++ Базовый курс

Не по теме:

(Кстати, как вы считаете хорошая книжка?)


Вопрос у меня такой. Вот мы создаем объект класса derived, а потом вызываем функцию set через этот объект. В функции set два аргумента, кристально понятно, почему эта функция есть в base, там как раз два private члена и эта функция их инициализирует, а вот, что происходит, когда эта функция вызывается через derived, в нем ведь только один класса, а инициализация происходит двух каких-то переменных. В чем тут дело?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2016, 10:55
Ответы с готовыми решениями:

Чем отличаются структуры для наследования интерфейса от структур для наследования реализаций?
Дорогие программисты, во первых, хочу поздравить вас с Наступающим новым Годом!...

Наследования
Что именно наследует класс-потомок при наследовании? А что не наследует? Чем...

Наследования
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class student...

наследования
Приведите пожалуйста пару примеров наследования.

Интерфейсы и наследования
Есть вот такая структура class Base { public: virtual void...

6
Worf
43 / 43 / 8
Регистрация: 06.02.2014
Сообщений: 233
04.07.2016, 11:13 2
Класс, который был унаследован от какого-либо другого класса "видит" все, что есть в группе public у родителя, следовательно, вызвав функцию set из дочернего класса будет запись в переменные родителя, как и написано в самой функции.
Здесь нет ничего сверхестесственного.
Это как раз и называется инкапсуляция, которая позволяет защитить переменные от прямой записи и поэтому скрываются в protected, а с помощью функции только записываются
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
04.07.2016, 11:30  [ТС] 3
Worf, это я понимаю, чисто технически, это так. Вопрос в том, что
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
происходит, когда эта функция вызывается через derived, в нем ведь только один член класса, а инициализация происходит двух каких-то переменных
0
Worf
43 / 43 / 8
Регистрация: 06.02.2014
Сообщений: 233
04.07.2016, 11:35 4
Лучший ответ Сообщение было отмечено Blitzor DDD как решение

Решение

Вопрос, почему мы в SET задаем 2 переменные, хотя в дочернем только 1 переменная? Потому что функция set относится только к родительскому классу и там задает значения переменным. Если вы создадите экземпляр только дочернего класса, то экземпляр родительского тоже создастся, иначе как бы вы выполнили функцию родительского, который не создался бы тоже
1
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
04.07.2016, 11:42  [ТС] 5
Worf,
Цитата Сообщение от Worf Посмотреть сообщение
Если вы создадите экземпляр только дочернего класса, то экземпляр родительского тоже создастся
ааа, теперь понятно. То есть, тут как-бы неявно, происходит инициализация переменных i, j объекта класса base?
0
Worf
43 / 43 / 8
Регистрация: 06.02.2014
Сообщений: 233
04.07.2016, 11:43 6
Да, конечно, иначе на этапе вызова функции даже ошибка бы вылетала, потому что не к чему было бы обращаться, если бы не было ничего проинициализированл
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
04.07.2016, 11:44  [ТС] 7
Worf, понятно. Спасибо большое!
0
04.07.2016, 11:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2016, 11:44

Виды наследования С++
Построить класс статистическая выборка числовых величин со свойствами:...

Класс наследования
ак єто можно сделать Класс одиночного наследования. a) Модифицировать класс...

Спецификаторы наследования
Всем здрасьте, у меня возник такой вопросик. Есть базовый класс - Main. Есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru