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

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

Войти
Регистрация
Восстановить пароль
 
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
#1

Производный класс не видит перегруженную операцию базового класса - C++

16.04.2013, 16:04. Просмотров 691. Ответов 8
Метки нет (Все метки)

Подскажите пожалуйста, почему производный класс, а именно его объект не видит перегруженную операцию, в данном случае это префиксные операции (++,--). Без них программа запускается. В начале базовый класс, за ним производный,а у производного есть свой производный. Вот код:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#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); }
   };
////////////////////////////////////////////////////////////////
class CountDn : public Counter
   {
   public:
      CountDn() : Counter()
         { }
      CountDn(int c) : Counter(c)
         { }
      CountDn operator--()
         { return CountDn(--count); }
   };
////////////////////////////////////////////////////////////////
 
 
class C3 : public CountDn
{
public:
    C3():CountDn(){}
    C3(int i):CountDn(i){}
 
 
    C3 operator--(int)
    {
       return C3(count--);
    }
    C3 operator++(int)
    {
        return C3(count++);
    }
};
////////////////////////////////////////////////////////
int main()
   {
       C3 c1(10);
 
       c1++;
       c1--;
       ++c1;
       --c1;
       c1++;
 
   cout << c1.get_count() << endl;
   return 0;
   }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2013, 16:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Производный класс не видит перегруженную операцию базового класса (C++):

Есть производный класс и базовый; при чём производный использует только ЧАСТЬ ресурсов базового, правильно ли это? - C++
Ну то есть базовый класс A, с полями, допустим, a, b, c, d. И я проектирую производный класс B и я железно знаю, что он будет использовать...

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

Как перенести operator из базового класса в производный? - C++
Добрый день! Подскажите, пожалуйста, на простых примерах, как нужно работать с оператором перегрузки операций, если он находится в...

Создать производный от класса Строка класс - C++
Описать производной от класса Строка класс Строка_Идентификатор. Строки данного класса строиться по правилам записи идентификатор в языке...

Создать производный класс complexExt от класса Complex - C++
задание: Создать производный класс complexExt от класса Complex, который должен - в разделе private содержать закрытые переменные-члены...

класс наследник на основе базового класса - C++
-----

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
anmartex
...
1703 / 1196 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
16.04.2013, 19:46 #2
Вы в производном уже перегрузили (++,--), правда с другим числом аргументов, так чего же вы хотите?
Данный код тоже не будет компилироваться:
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
#include <iostream>
 
using namespace std;
 
class A
{
   public:
      void who()
      {
         cout << "A" << endl;
      }
};
 
class B: public A
{
   public:
      void who(int)
      {
         cout << "B" << endl;
      }
};
 
int main()
{
   B b;
 
   b.who(); // Ошибка. Сработает только если явно задать b.A::who()
 
   return 0;
}
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
16.04.2013, 21:13  [ТС] #3
Цитата Сообщение от anmartex Посмотреть сообщение
Вы в производном уже перегрузили (++,--), правда с другим числом аргументов, так чего же вы хотите?
В книге Р. Лафоре ООП, пишется что компилятор различает префиксную и постфиксную форму перегрузки по аргументу int.
Перед этим было задание в котором была перегрузка операции [ ] (квадратных скобок). Ситуация примерно такая же была, но программа запускалась не смотря на то, что перегрузка была в первом классе, а потомок был как данной ситуации 3м классом по счету. Т.е. А потомок Б, у Б потомок Г. Явно я не указывал "скобки". Возможно чего-то не понимаю. Но в задании четко говорится сделайте потомка с префиксом инкриминации.

Добавлено через 55 минут
Точнее не префиксной, а постфиксной. В итоге префиксная не работает. Вот задание.
Миниатюры
Производный класс не видит перегруженную операцию базового класса  
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
16.04.2013, 21:30 #4
http://www.parashift.com/c++-faq-lite/hiding-rule.html
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
16.04.2013, 21:52  [ТС] #5
Благодарю за ссылку. Но увы, прочитать я то смогу, а уловить всю логику и перевести нормально - вряд ли. Можно ли в 2х словах?
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
16.04.2013, 22:37 #6
IvanInanovich, перегружая метод в производном классе вы скрываете метод определённый в базовом. Для того чтобы сделать этот метод видимым для производного класса нужно использовать ключевое слово using. В вашем случае
C++
1
2
3
4
5
6
7
class C3 : public CountDn
{
public:
    //...
    using CountDn::operator ++;
    using CountDn::operator --;
};
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
16.04.2013, 22:55  [ТС] #7
Цитата Сообщение от rangerx Посмотреть сообщение
IvanInanovich, перегружая метод в производном классе вы скрываете метод определённый в базовом. Для того чтобы сделать этот метод видимым для производного класса нужно использовать ключевое слово using. В вашем случае
C++
1
2
3
4
5
6
7
class C3 : public CountDn
{
public:
    //...
    using CountDn::operator ++;
    using CountDn::operator --;
};
Работает, спасибо большое. Теперь все понятно)) Единственное не понял почему в таком случае не ставятся круглые скобки в конце перегрузки оператора. Я было попробовал с ними, но выбило ошибку. Как быть в ситуации если нужно будет операция с аргументом? К примеру operator++(int).
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
17.04.2013, 13:48 #8
Теперь все понятно)) Единственное не понял почему в таком случае не ставятся круглые скобки в конце перегрузки оператора.
Судя по всему, не очень Допустим, есть следующая иерархия классов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A
{
public:
    void f();
    void f(int);
    void f(int, int);
};
 
class B : public A
{
public:
    // перекрываем метод с именем f(если не иcпользовать using, то у класса B будет своя версия метода f...
    //... к тем его перегрузкам, что находятся в А можно будет обратиться только, если явно указать их область видимости...
    //... например, имя_объект.A::f())
    void f(int, int);
    void f(int, int, int);
};
Используя ключевое слово using можно явно указать, что класс потомок, помимо уже определённых в нём методов, будет использовать реализции методов определённых с тем же именем в указаном классе предке
C++
1
2
3
4
5
6
7
8
9
10
class B : public A
{
public:
    void f(int, int);
    void f(int, int, int);
    
    // использовать f из А без указания области видимости
    // при этом из A будут использоваться только f() и f(int) потому как метод f(int, int) переопределён)
    using A::f; 
};
Т.е. это не включение какой-то отдельной перегрузки класса предка, а указание использовать все не переопределённые в классе потомке реализации.

Как быть в ситуации если нужно будет операция с аргументом? К примеру operator++(int).
Если в случае перекрытия нужно использовать реализацию отдельного метода класса предка, то можно просто вызвать необходимый метод явно
C++
1
2
3
4
5
6
7
8
9
class B : public A
{
public:
    void f(int x)
    {
        A::f(x);
    }
//...
};
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
17.04.2013, 15:25  [ТС] #9
Огромное Вам спасибо! Теперь точно все понял))) Удивительно что в книге об этом ничего не говорилось.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2013, 15:25
Привет! Вот еще темы с ответами:

Создать производный класс ТРОИЧНЫЙ ВЕКТОР от класса Vector - C++
Народ!!! Please help me! Задолбался уже!:wall: Вобщем такое задание: Создать производный класс ТРОИЧНЫЙ ВЕКТОР от класса Vector....

Создать перегруженную операцию operator= для копирования строк - C++
Ввести с клавиатуры строку символов S1. Признак окончания ввода строки - нажатие клавиши &quot;Ввод&quot;. Программа должна содержать перегруженную...

Создать класс EMPLOYEE, производный от класса PERSON и использовать их для вычисления зарплаты сотрудника - C++
Базовый класс: ЧЕЛОВЕК (PERSON) Имя (name) – string Возраст (age) – int Создать производный класс EMPLOYEE, имеющий поля: ...

Класс Integer и опредлить перегруженную функцию - C++
Здравстуйте у меня вот такое задание: Создать класс целых чисел integer. Определить перегруженную функцию, возвращающую максимальное...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.04.2013, 15:25
Ответ Создать тему
Опции темы

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