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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
#1

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

04.07.2016, 10:55. Просмотров 209. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос механизм наследования (C++):

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

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

Наследования - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class student { protected: int sem; string name; float...

Наследования - C++
Что именно наследует класс-потомок при наследовании? А что не наследует? Чем отличаются private, public и protected наследование?

Реализация наследования - C++
Здравствуйте, при решении лабораторной возникла такая проблема: при создании объекта производного класса в конструкторе базового...

Класс наследования - C++
ак єто можно сделать Класс одиночного наследования. a) Модифицировать класс динамической структуры данных,содержащей строки (л.р. №2),...

6
Worf
43 / 43 / 6
Регистрация: 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 / 6
Регистрация: 06.02.2014
Сообщений: 233
04.07.2016, 11:35 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вопрос, почему мы в 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 / 6
Регистрация: 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
Привет! Вот еще темы с ответами:

Пример наследования - C++
Здравствуйте! Снова требуется пример. На сей раз пример наследования. Ничего подходящего пока найти не могу. Допустим, базовый класс и...

Свойства наследования - C++
1) Объект класса-потомка может вызывать некоторые методы класса-предка. 2) Наследование - это механизм получения нового класса на основе...

Интерфейсы и наследования - C++
Есть вот такая структура class Base { public: virtual void SomeBaseFun()=0; } class Object1: public Base { public: ...

Классы наследования - C++
Необходима чтобы personcart содержал массив карточек персон (класс cart) как не крутил вечная ошибка fatal error LNK1120: 1 unresolved...


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

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

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