0 / 0 / 0
Регистрация: 09.07.2018
Сообщений: 2
1

Наследование функций базовых классов

09.07.2018, 06:52. Показов 3038. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Изучаю С++ по книге Р. Лафоре ООП С++
Примеры из главы 9 "Наследование" ставят меня в тупик:

C++
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
33
34
35
36
37
38
39
// counten.cpp
//inheritance with Counter class
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////
class Counter                 //базовый класс
{
  protected:
    unsigned int count;       //счётчик
  public:
    Counter ( ) : count ( 0 ) //конструктор без аргументов
      { }
    Counter ( int c ) : count ( c )
      { }
    unsigned int get_count ( ) const
      { return count; }       // возвращает значение счётчика
    Counter operator++ ( )    //увеличивает значение
                              //счётчика (префикс)
      { return Counter ( ++count ); } // возвращается экземпляр класса Counter
};
//////////////////////////////////////////////////////////
class CountDn : public Counter// производный класс
{
  public:
    Counter operator-- ( )    //уменьшает значение счётчика
      { return Counter ( --count ); } // возвращается экземпляр класса Counter
};
//////////////////////////////////////////////////////////
int main ( )
{
  CountDn c1;                           // объект с1
  cout << "\n c1=" << c1.get_count ( ); //вывод на печать
  ++c1; ++c1; ++c1;                     // три раза инкремент - ПОЧЕМУ ЭТО РАБОТАЕТ???
  cout << "\n c1=" << c1.get_count ( ); //вывод на печать
  --c1; --c1; //декремент два раза - ПОЧЕМУ ЭТО РАБОТАЕТ???
  cout << "\n c1=" << c1.get_count ( ); //вывод на печать
  cout << endl;
  return 0;
}
Не понятно почему пример компилируется и работает без ошибок. В функции main () создаётся объект класса CountDn производного от Counter. При вызове операторов инкремента, декремента возвращается экземпляр класса Counter. Каким образом экземпляр класса Counter преобразуется в CountDn?
При этом такое ожидаемо не прокатывает:
с1 = ++с1
Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.07.2018, 06:52
Ответы с готовыми решениями:

Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций обработки исключи
Создать программу с абстрактным базовым классом и множественным наследованием, реализовать в нем: ...

Множественное наследование с использованием абстрактных базовых классов
тема: Множественное наследование с использованием абстрактных базовых классов, файлового...

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг...

Наследование классов, механизм виртуальных функций
Выручайте !!! Программа должна содержать: • базовый класс Х, включающий два элемента х1, х2...

4
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
09.07.2018, 07:06 2
Цитата Сообщение от Foxhound0625 Посмотреть сообщение
Каким образом экземпляр класса Counter преобразуется в CountDn?
класс CountDn наследует параметры Counter
0
Модератор
Эксперт С++
13599 / 10830 / 6441
Регистрация: 18.12.2011
Сообщений: 28,871
09.07.2018, 09:01 3
Цитата Сообщение от Foxhound0625 Посмотреть сообщение
При этом такое ожидаемо не прокатывает:
с1 = ++с1
Надо возвращать ссылку
C++
1
2
3
4
5
6
Counter& operator++ ( )    //увеличивает значение
                              //счётчика (префикс)
{
   ++count;
   return *this; 
}
0
4260 / 3319 / 925
Регистрация: 25.03.2012
Сообщений: 12,497
Записей в блоге: 1
09.07.2018, 09:36 4
Лучший ответ Сообщение было отмечено Foxhound0625 как решение

Решение

Цитата Сообщение от Foxhound0625 Посмотреть сообщение
При этом такое ожидаемо не прокатывает:
с1 = ++с1
ну раз ожидаемо не прокатывает, значит всё нормально, ошибка не пропускается мимо - не?
А где в этом ++c1;++c1;++c1; ошибка? Там же никак возвращаемое значение не используется!
1
0 / 0 / 0
Регистрация: 09.07.2018
Сообщений: 2
09.07.2018, 23:36  [ТС] 5
Да, действительно, в случае ++с1 создаётся объект Count, но он ничему не присваивается и соотв. ошибки нет. Спасибо за ответ.
0
09.07.2018, 23:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2018, 23:36
Помогаю со студенческими работами здесь

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов)
Тема: Множественное наследование. Явная реализация методов базовых абстрактных классов. Как...

Ошибка в инициализации базовых классов
Привет. Пишу код из книги Лафоре. #include &lt;iostream&gt; using namespace std; #include...

Использование базовых и производных классов
Не могу решить задачу с классами помогите с решением. Создать класс String – строка. Определить...

Класс наследуемый от двух базовых классов
Друзья Являеться ли класс (А)- Классом наследуемым от двух базовых классов? Если не правильно то...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru