Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
04.07.2016, 10:55     механизм наследования #1
Есть такой код:

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, в нем ведь только один класса, а инициализация происходит двух каких-то переменных. В чем тут дело?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2016, 10:55     механизм наследования
Посмотрите здесь:

C++ наследования
C++ Особенности наследования
C++ Класс наследования
Реализация наследования C++
Наследования C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Worf
42 / 42 / 6
Регистрация: 06.02.2014
Сообщений: 227
04.07.2016, 11:13     механизм наследования #2
Класс, который был унаследован от какого-либо другого класса "видит" все, что есть в группе public у родителя, следовательно, вызвав функцию set из дочернего класса будет запись в переменные родителя, как и написано в самой функции.
Здесь нет ничего сверхестесственного.
Это как раз и называется инкапсуляция, которая позволяет защитить переменные от прямой записи и поэтому скрываются в protected, а с помощью функции только записываются
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
04.07.2016, 11:30  [ТС]     механизм наследования #3
Worf, это я понимаю, чисто технически, это так. Вопрос в том, что
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
происходит, когда эта функция вызывается через derived, в нем ведь только один член класса, а инициализация происходит двух каких-то переменных
Worf
42 / 42 / 6
Регистрация: 06.02.2014
Сообщений: 227
04.07.2016, 11:35     механизм наследования #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вопрос, почему мы в SET задаем 2 переменные, хотя в дочернем только 1 переменная? Потому что функция set относится только к родительскому классу и там задает значения переменным. Если вы создадите экземпляр только дочернего класса, то экземпляр родительского тоже создастся, иначе как бы вы выполнили функцию родительского, который не создался бы тоже
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
04.07.2016, 11:42  [ТС]     механизм наследования #5
Worf,
Цитата Сообщение от Worf Посмотреть сообщение
Если вы создадите экземпляр только дочернего класса, то экземпляр родительского тоже создастся
ааа, теперь понятно. То есть, тут как-бы неявно, происходит инициализация переменных i, j объекта класса base?
Worf
42 / 42 / 6
Регистрация: 06.02.2014
Сообщений: 227
04.07.2016, 11:43     механизм наследования #6
Да, конечно, иначе на этапе вызова функции даже ошибка бы вылетала, потому что не к чему было бы обращаться, если бы не было ничего проинициализированл
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2016, 11:44     механизм наследования
Еще ссылки по теме:

C++ Организация наследования
C++ Наследования
C++ Пример наследования

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

Или воспользуйтесь поиском по форуму:
Blitzor DDD
12 / 12 / 1
Регистрация: 17.08.2015
Сообщений: 439
04.07.2016, 11:44  [ТС]     механизм наследования #7
Worf, понятно. Спасибо большое!
Yandex
Объявления
04.07.2016, 11:44     механизм наследования
Ответ Создать тему
Опции темы

Текущее время: 02:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru