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

Наследование преинкремента в класс с постинкрементом - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 17:34     Наследование преинкремента в класс с постинкрементом #1
Дана задача: Написать класс Counter, реализовать в нем перегрузку преинкремента. В производном от него классе реализовать перегрузку постинкремента.
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
#include <iostream>
using namespace std;
 
class Counter
{
protected:
    int count;
public:
    Counter(int c=0): count(c) {}
    ~Counter(){}
    Counter &operator++() {count++; return (*this);}
};
 
class Counter2: public Counter
{
public:
    Counter2(int c=0):Counter(c) {}
    ~Counter2(){}
    Counter2 operator++(int){Counter2 tmp(*this); count++; return tmp;}
};
 
int main()
{
    Counter2 i=0;
    ++i;
}
Ошибка: error C2675: unary '++' : 'Counter2' does not define this operator or a conversion to a type acceptable to the predefined operator.
Указывает на строку с ++i.
Я так понимаю, что из-за одинаковых имен операторов, преинкремент не наследуется. Как сделать, чтобы он наследовался?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2012, 17:34     Наследование преинкремента в класс с постинкрементом
Посмотрите здесь:

Абстрактный класс. Наследование C++
C++ Наследование: Создать класс двигатель
Наследование и абстрактный класс C++
Класс точка(наследование) C++
C++ Виртуальное наследование (указатель на базовый класс)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
23.01.2012, 18:34     Наследование преинкремента в класс с постинкрементом #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
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class A
{
    public:
    
    A(int x) {count = x;}    
        
    void operator++ ()
    {
        ++count;
    }
    
    /*A operator++ (int)
    {
        A tmp = (*this); 
        count++; 
        return tmp;
    }*/
    
    private:
    int count;
};
 
class B: public A
{
    public:
    B(int x) : A(x)
    {
    }
    
    void operator++ ()
    {
        A::operator++();
    }    
    
    B operator++ (int)
    {
        B tmp = (*this); 
        A::operator++(); 
        return tmp;
    }
};
 
int main(int argc, char *argv[])
{
    B b(0);
    b++;
    ++b;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Но почему так происходит хз. Эксперты, где вы?

Хотя если не перегружать в наследнике ++ вообще, то всё наследуется:
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class A
{
    public:
    
    A(int x) {count = x;}    
        
    void operator++ ()
    {
        ++count;
    }
    
    private:
    int count;
};
 
class B: public A
{
    public:
    B(int x) : A(x)
    {
    }
};
 
int main(int argc, char *argv[])
{
    B b(0);
    ++b;
    system("PAUSE");
    return EXIT_SUCCESS;
}
WTF?!
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
23.01.2012, 18:42     Наследование преинкремента в класс с постинкрементом #3
А ниче, что у тебя префиксный инкремент не определён?
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 18:46  [ТС]     Наследование преинкремента в класс с постинкрементом #4
Цитата Сообщение от NoMasters Посмотреть сообщение
А ниче, что у тебя префиксный инкремент не определён?
Определен в классе Counter. Класс Counter2 производный от него.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
23.01.2012, 18:55     Наследование преинкремента в класс с постинкрементом #5
если нужен ++i и i++ для Counter2, придется их оба определсять в Counter2. иначе Counter2::operator++(int) скрывает Counter1::operator++().
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 18:58  [ТС]     Наследование преинкремента в класс с постинкрементом #6
retmas, ну это ясно. Но может есть способ, при котором преинкремент всё же унаследуется в Counter2? Или задание не реализуемое?
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
23.01.2012, 18:58     Наследование преинкремента в класс с постинкрементом #7
Цитата Сообщение от retmas Посмотреть сообщение
иначе Counter2::operator++(int) скрывает Counter1::operator++()
Ну да, но функции то разные. Чудеса перегрузки, так сказать:
C++
1
2
void func();
void func(int);
Вот и остался вопрос почему
Цитата Сообщение от dimcoder Посмотреть сообщение
так происходит
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
23.01.2012, 19:27     Наследование преинкремента в класс с постинкрементом #8
нет тут чудес. ф-ии находятся в разных областях видимости, поэтому - сокрытие, а не перегрузка

Добавлено через 20 минут
Riderik, уточните, что вам нужно. преинкремент - определен только в базовом, а пост в производном? тогда используйте using
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 19:35  [ТС]     Наследование преинкремента в класс с постинкрементом #9
retmas, Отлично, то что нужно, спасибо.

Добавлено через 32 секунды
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
#include <iostream>
using namespace std;
 
class Counter
{
protected:
    int count;
public:
    Counter(int c=0): count(c) {}
    ~Counter(){}
    Counter &operator++() {count++; return (*this);}
};
 
class Counter2: public Counter
{
public:
    using Counter::operator ++;
    Counter2(int c=0):Counter(c) {}
    ~Counter2(){}
    Counter2 operator++(int){Counter2 tmp(*this); count++; return tmp;}
};
 
int main()
{
    Counter2 i=0;
    ++i;
}
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
23.01.2012, 19:36     Наследование преинкремента в класс с постинкрементом #10
Цитата Сообщение от retmas Посмотреть сообщение
нет тут чудес.
Согласен. Проверил с простыми функциями, то же самое.
Цитата Сообщение от retmas Посмотреть сообщение
сокрытие
хз что.
Цитата Сообщение от retmas Посмотреть сообщение
ф-ии находятся в разных областях видимости, поэтому - сокрытие, а не перегрузка
По идее функция наследуется, потом перегружается. А здесь как тогда? Есть мысли? Может ссылки со справкой?

Цитата Сообщение от retmas Посмотреть сообщение
используйте using
retmas, спасибо.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.01.2012, 22:17     Наследование преинкремента в класс с постинкрементом #11
Цитата Сообщение от dimcoder Посмотреть сообщение
Есть мысли?
Вам же уже сказали, что это сокрытие. Но вы на это гордо ответили
Цитата Сообщение от dimcoder Посмотреть сообщение
хз что
Перегрузка была бы, если бы оба метода находились в одном классе. Но если есть метод в классе-родителе и одноимённый метод в классе-наследнике, то метод наследника не перегружает (создаёт новый вариант того же метода), а скрывает (создаёт полностью новое семейство методов, без возможности прямого доступа к методам родителя через объект наследника).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2012, 10:12     Наследование преинкремента в класс с постинкрементом
Еще ссылки по теме:

C++ Класс Car. Наследование
Класс бинарных деревьев. Наследование C++
C++ Абстрактный базовый класс и множественное наследование

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

Или воспользуйтесь поиском по форуму:
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
24.01.2012, 10:12     Наследование преинкремента в класс с постинкрементом #12
silent_1991, спасибо, прояснили.
Yandex
Объявления
24.01.2012, 10:12     Наследование преинкремента в класс с постинкрементом
Ответ Создать тему
Опции темы

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