Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814

Наследование

06.08.2015, 18:01. Показов 1497. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Ребята, почему в данном примере
Кликните здесь для просмотра всего текста
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;
 
//---------------------------------------------------------------------------//
//Определение класса Counter
//---------------------------------------------------------------------------//
class Counter{
    protected:
        unsigned int count;
    public:
        Counter() : count(0)
        {}
        Counter(int c) : count(c)
        {}
        unsigned int getCount() const{
            return count;
        }
        Counter operator ++(){
            return Counter(++count);
        }
};
//---------------------------------------------------------------------------//
//Определение класса CountDn, наследуемого от класса Counter
//---------------------------------------------------------------------------//
class CountDn : public Counter{
    public:
        CountDn() : Counter()
        {}
        CountDn(int c) : Counter(c)
        {}
        CountDn operator --(){
            return CountDn(--count);
        }
};
//---------------------------------------------------------------------------//
//Определение класса
//---------------------------------------------------------------------------//
class PCount : public CountDn{
    public:
        PCount() : CountDn()
        {}
        PCount(int c) : CountDn(c)
        {}
        PCount operator ++(int){
            return PCount(count++);
        }
        PCount operator --(int){
            return PCount(count--);
        }
};
 
int main(){
    PCount p(0);
 
    ++p;
 
    cout << p.getCount() << endl;
 
    system("PAUSE");
    return 0;
}


Не могу использовать префиксную операцию ++?

Добавлено через 1 минуту
Вот, что пишет компилятор:
error C2675: унарный '++': 'PCount' не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.08.2015, 18:01
Ответы с готовыми решениями:

Заменить наследование классов на наследование интерфейсов
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование
int main() { setlocale(LC_ALL, &quot;RUS&quot;); Stud FIRST_TRY; FIRST_TRY.set(); exam(FIRST_TRY); FIRST_TRY.get(); ...

Наследование
Реализовать наследование классов квартиры,этаж,подъезд,дом

30
 Аватар для Monty_Python
8 / 8 / 6
Регистрация: 31.07.2015
Сообщений: 39
06.08.2015, 18:03
Цитата Сообщение от Nishen Посмотреть сообщение
префиксную операцию ++
используй +=
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
06.08.2015, 18:05  [ТС]
Monty_Python, ЧТО?!
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 18:09
Я наверное чего-то не знаю, но постфиксный оператор класса PCount почему-то "затмевает" префиксный класса Counter.
Хотя, если вдуматься, то вроде всё становится на свои места.
0
 Аватар для Monty_Python
8 / 8 / 6
Регистрация: 31.07.2015
Сообщений: 39
06.08.2015, 18:09
Цитата Сообщение от Nishen Посмотреть сообщение
ЧТО
оу, не верно понял.
Попробуй изменить на:
C++
1
2
3
4
Counter operator++(){
    ++count;
    return Counter(count);
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:10
лекарство:

http://rextester.com/IKAMBH10740


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
#include <iostream>
using namespace std;
 
struct Counter
{
    unsigned int count;
 
    Counter() : count(0)        {}
    Counter(int c) : count(c)   {}
    unsigned int getCount() const{ return count; }
    Counter operator++(){ return Counter(++count);  }
};
 
struct CountDn : Counter
{
    using Counter::Counter;
    CountDn operator--(){ return CountDn(--count); }
};
 
 
struct PCount : CountDn
{
    using CountDn::CountDn;
    
    using CountDn::operator--;
    using CountDn::operator++;
    
    
    
    PCount operator++(int){ return PCount(count++); }
    PCount operator--(int){ return PCount(count--); }
    
    
};
 
int main()
{
    PCount p;    
 
    ++p;
    
    cout << p.getCount() << endl;
}
1
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
06.08.2015, 18:15  [ТС]
castaway, я бы хотел понять почему, но не могу разобраться.

Добавлено через 3 минуты
hoggy, да, данное лекарство я уже видывал, но я бы хотел разобраться, почему нельзя использовать мой код.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
06.08.2015, 18:20
Nishen, ты задания из книги Лафоре чтоли решаешь?
В свое время на те же грабли наступил, в теме решенных задач по книге Лафоре посмотри, я выложил по всем главам =)
0
06.08.2015, 18:21  [ТС]

Не по теме:

Ferrari F1, да, но что это меняет?

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:22
Цитата Сообщение от Nishen Посмотреть сообщение
но я бы хотел разобраться, почему нельзя использовать мой код
потому что функция-член наследника:
C++
1
PCount operator--(int)
перекрывает собой одноименную функцию-член базового класса:
C++
1
CountDn operator--();
вот ещё пример:

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>
 
 
struct base
{
    void foo(int){}
};
 
 
struct der: base
{
    
    // перекрыла собой одноименную функцию в базовом классе
    void foo(){}
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    der d;
    
    // error: no matching function for call to ‘der::foo(int)’
    d.foo(10);
}
2
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.08.2015, 18:22
...
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
06.08.2015, 18:25
Nishen, в книге Лафоре не описывается этот тонкий момент, почему эта ошибка может случиться, но в книге Дейтелов, она упоминается.

Проблема вся в том, что сигнатура функции дочернего класса перекрывает сигнатуру базового класса, т.е. одинаковые имена методов накладываются друг на друга, из-за этого невозможно обратиться к методу базового класса.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:27
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
одинаковые имена накладываются друг на друга, из-за этого невозможно обратиться к методу базового класса.
прямо так уж невозможно?

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
#include <iostream>
 
 
struct base
{
    void foo(int){  std::cout<<"success\n"; }
};
 
 
struct der: base
{
    // перекрыла собой одноименную функцию в базовом классе
    void foo(){}
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    der d;
    
    d.base::foo(10);
}
1
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
06.08.2015, 18:28
hoggy, да знаю я, что можно переопределить метод. Сказанное мной, относится к ситуации с разными сигнатурами
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:29
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
сказанное мной, относится к ситуации с разными сигнатурами
а я думал: к невозможности позвать функцию-член базового класса.
и кстати, сигнатуры у них разные.
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
06.08.2015, 18:32  [ТС]
hoggy, получается, что компилятор различает одноименные функции по аргументам только в пределах одного класса. Но если одноименные функции с разным набором аргументов расположены в разных классах при наследовании, то компилятор будет использовать функцию наследуемого класса.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:35
Цитата Сообщение от Nishen Посмотреть сообщение
получается, что компилятор различает одноименные функции по аргументам только в пределах одного класса. Но если одноименные функции с разным набором аргументов расположены в разных классах при наследовании, то компилятор будет использовать функцию наследуемого класса.
ага. можно расшарить область видимости при помощи using.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
06.08.2015, 18:35
hoggy, не знаю, что ты за примеры придумываешь, но мне хватило информации из данной темы
Поясните утверждение из учебника
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:38
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
не знаю, что ты за примеры придумываешь, но мне хватило информации из данной темы
видимо вам не очень хватило.
0
06.08.2015, 18:41

Не по теме:

Цитата Сообщение от Ferrari F1 Посмотреть сообщение
hoggy, да знаю я, что можно переопределить метод. Сказанное мной, относится к ситуации с разными сигнатурами
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Проблема вся в том, что сигнатура функции дочернего класса перекрывает сигнатуру базового класса, т.е. одинаковые имена методов накладываются друг на друга
Мне почему-то кажется что бы словоблудишь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2015, 18:41
Помогаю со студенческими работами здесь

Наследование
Суть задачи: Реализуйте класс символьная строка,наследуйте от него класс двоичная строка. Реализуйте методы Show(от базовой строки) ...

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

наследование
Помогите разобраться в программе. Почему возникают такие ошибки cylindr.cpp expected `,' or `...' before '&amp;' token cylindr.cpp `c'...

Наследование
Доброе дня, прошу вас помочь в решение данной задачи.

Наследование?!
привет всем. Есть класс Circle c1, c2, c3 Нужно реализовать через наследование класс множество, прошу помочь как он будет выглядеть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru