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

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

Восстановить пароль Регистрация
 
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
16.04.2013, 16:04     Производный класс не видит перегруженную операцию базового класса #1
Подскажите пожалуйста, почему производный класс, а именно его объект не видит перегруженную операцию, в данном случае это префиксные операции (++,--). Без них программа запускается. В начале базовый класс, за ним производный,а у производного есть свой производный. Вот код:

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     Производный класс не видит перегруженную операцию базового класса
Посмотрите здесь:

Класс Integer и опредлить перегруженную функцию C++
C++ Создать производный класс ТРОИЧНЫЙ ВЕКТОР от класса Vector
Есть производный класс и базовый; при чём производный использует только ЧАСТЬ ресурсов базового, правильно ли это? C++
Создать производный класс complexExt от класса Complex C++
C++ Один класс не видит другой. Преобразование класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 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
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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);
    }
//...
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2013, 15:25     Производный класс не видит перегруженную операцию базового класса
Еще ссылки по теме:

класс наследник на основе базового класса C++
C++ Разработать производный от абстрактного класса Figure класс и класс, производный от производного
C++ Создать перегруженную операцию operator= для копирования строк

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

Или воспользуйтесь поиском по форуму:
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
17.04.2013, 15:25  [ТС]     Производный класс не видит перегруженную операцию базового класса #9
Огромное Вам спасибо! Теперь точно все понял))) Удивительно что в книге об этом ничего не говорилось.
Yandex
Объявления
17.04.2013, 15:25     Производный класс не видит перегруженную операцию базового класса
Ответ Создать тему
Опции темы

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