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

Наследование классов. Конфликт методов - C++

Восстановить пароль Регистрация
 
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
23.12.2012, 23:56     Наследование классов. Конфликт методов #1
Здравствуйте! Проблема следующая. Написал операции постфиксной и префиксной декрементации и инкрементации счетчика, который находится в базовом классе. Почему то возникает конфликт ( хотя компилятор об этом не сообщает ), с такими методами как Counter operator++ ( ) и CounPf operator++ ( int ). Если убрать метод CounPf operator++ ( int ), то можно будет инкрементировать объект класса CounPf префиксным методом Counter operator++ ( ). Идентичная ситуация возникает с префиксной и постфиксной операцией декрементации. Помогите пожалуйста решить эту проблемму. Вот код моей прогаммы. При попытке инкрементировать или декрементировать объект префиксной операцией выдает "illegal structure operation".
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
#include <iostream>
using namespace std;
//////////////////////////////////////////////
class Counter
{
 protected:
  unsigned int count;
 public:
  Counter ( ) : count ( )
  { }
  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 CounPf : public CountDn
{
 public:
  CounPf ( ) : CountDn ( )
  { }
  CounPf ( int c ) : CountDn ( c )
  { }
  CounPf operator++ ( int )
  { return CounPf ( count++ ); }
  CounPf operator-- ( int )
  { return CounPf ( count-- ); }
};
/////////////////////////////////////////////////
int main ( )
{
 CounPf c1 = 90;
 --c1;
 cout << " Object c1 = " << c1.get_count() << endl;
 
 system ("PAUSE");
 return 0;
}
И в то же время, если я не использую наследование вовсе. Никаких амбивалентностей между методами не наблюдается, хотя по сути методы одни и те же:
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
#include <iostream>
using namespace std;
//////////////////////////////////////////////
class Counter
{
 protected:
  unsigned int count;
 public:
  Counter ( ) : count ( )
  { }
  Counter ( int c ) : count ( c )
  { }
  unsigned int get_count ( ) const
  { return count; }
  Counter operator++ ( )
  { return Counter ( ++count ); }
  Counter operator++ ( int )
  { return Counter ( count++ ); }
  Counter operator-- ( int )
  { return Counter ( count-- ); }
    Counter operator-- ( )
  { return Counter ( --count ); }
};
 
/////////////////////////////////////////////////
int main ( )
{
 Counter c1 = 90;
 c1--;
 cout << " Object c1 = : " << c1.get_count()<< endl;
 
 system ("PAUSE");
 return 0;
}
Знающие люди! Помогите пожалуйстааааа!

Добавлено через 20 минут
c меня + и печенька!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2012, 23:56     Наследование классов. Конфликт методов
Посмотрите здесь:

Наследование классов. Копирование производных классов C++
определение классов и методов C++
C++ Наследование Классов
C++ Наследование, и перегрузки методов
C++ Наследование и перегрузка методов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,573
Записей в блоге: 17
24.12.2012, 01:01     Наследование классов. Конфликт методов #2
Слыхали про виртуальные методы ?

Добавлено через 7 минут
Цитата Сообщение от fuzzytoozy Посмотреть сообщение
При попытке инкрементировать или декрементировать объект префиксной операцией выдает "illegal structure operation".
Ну так у вас определена только одна форма.

Добавлено через 36 минут
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
//-------------------------------------------
class Counter
{
 protected:
    size_t count;
 public:
    Counter():count (){ }
    Counter (size_t c):count (c) { }
 
     virtual size_t get_count() const { return count; }
 
     Counter operator++ ()
            {
                count++;
                return *this;
            }
     Counter operator++ (int notused)
            {
                return Counter(count++);
            }
 
     virtual ~Counter(){};
};
//-------------------------------------------
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
24.12.2012, 01:27  [ТС]     Наследование классов. Конфликт методов #3
нет не слыхал. Эта задача дана до виртуальных методов. И как вы привели пример в одном классе 2 подобных метода. Они во втором приведенном мной примере прекрасно работают. Если эти методы включены в один класс то они работают. Все четыре штуки постфиксная инкрементация, префиксная инкрементация, постфиксная декрементация и префиксная декрементация. Не работает только в случае использования наследования. Как это исправить не прибегая к использованию виртуальных методов.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,573
Записей в блоге: 17
24.12.2012, 01:51     Наследование классов. Конфликт методов #4
Ну у меня ваш пример нормально работает если изменить базовый класс как я привел выше

Добавлено через 10 минут
Вы имеете не работает :

C++
1
2
 CounPf c1 = 90;
 ++c1;
Добавлено через 1 минуту
Так по видимому это из-за того что они возвращаю разные значения в разных классах
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
24.12.2012, 02:36  [ТС]     Наследование классов. Конфликт методов #5
так возвращают они одни значения. Посмотрите на конструкторы. Просто методы operator++ ( ); и operator++(int) почему то ( в первом примере ) конфликтят.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,573
Записей в блоге: 17
24.12.2012, 02:38     Наследование классов. Конфликт методов #6
Counter operator++ (int notused)
и
CounPf operator++ ( int )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2012, 03:30     Наследование классов. Конфликт методов
Еще ссылки по теме:

C++ Связь классов и методов
Наследование параметризованных методов C++
Вызов методов классов по указателям C++

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

Или воспользуйтесь поиском по форуму:
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
24.12.2012, 03:30  [ТС]     Наследование классов. Конфликт методов #7
в моей программе нет метода класса Counter с аргументом int. В общем я перезагрузил компьютер и всё скомпилировалось без ошибок и работает =)
А вам спасибо в любом случае.

Добавлено через 5 минут
ан нет. все равно не работает =(

Добавлено через 4 минуты
я не понимаю почему класс

C++
1
2
3
4
5
6
7
8
9
10
class CountDn : public Counter
{
 public:
  CountDn ( ) : Counter ( )
  { }
  CountDn ( int c ) : Counter ( c )
  { }
  CountDn operator-- ( )
  { return CountDn ( --count ); }
};
Объект класса CountDn может пользоваться преспокойно методом инкрементации базового класса и декрементации своего. А класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
class CounPf : public CountDn
{
 public:
  CounPf ( ) : CountDn ( )
  { }
  CounPf ( int c ) : CountDn ( c )
  { }
  CounPf operator++ ( int notused )
  { return CounPf ( count++ ); }
  CounPf operator-- ( int notused )
  { return CounPf ( count-- ); }
};
не может пользоваться ни методом префиксной инкрементации, ни методом префиксной декрементации. ПО ЧЕ МУ.

Добавлено через 16 минут
в общем суть вопроса такова. Почему метод класса CounPf operator++ ( int notused) перекрывает метод Counter operator++ ( ). Пока существует первый метод, второй метод недоступен. Как только я удаляю метод CounPf operator++ ( int notused) для объектов класса CountPf становится возможным использование метода Counter operator++ (). Пока же присутствует метод CountPf operation++ ( int notused ) работает собственно только он. Судя по всему это конфликт имён, но в если использовать оба метода как методы одного класса, как я привел в примере выше, то всё будет замечательно работать. Так подскажите кто нибудь. Почему же они конфликтуют и как избежать этого и возможно ли это в принципе
Yandex
Объявления
24.12.2012, 03:30     Наследование классов. Конфликт методов
Ответ Создать тему
Опции темы

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