1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,801
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый вечер!
Ребята, почему в данном примере
Кликните здесь для просмотра всего текста
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2015, 18:01
Ответы с готовыми решениями:

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

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

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

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

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

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
1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,801
06.08.2015, 18:15  [ТС] 7
castaway, я бы хотел понять почему, но не могу разобраться.

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

Не по теме:

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

0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:22 10
Цитата Сообщение от 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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.08.2015, 18:22 11
...
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
06.08.2015, 18:25 12
Nishen, в книге Лафоре не описывается этот тонкий момент, почему эта ошибка может случиться, но в книге Дейтелов, она упоминается.

Проблема вся в том, что сигнатура функции дочернего класса перекрывает сигнатуру базового класса, т.е. одинаковые имена методов накладываются друг на друга, из-за этого невозможно обратиться к методу базового класса.
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:27 13
Цитата Сообщение от 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
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
06.08.2015, 18:28 14
hoggy, да знаю я, что можно переопределить метод. Сказанное мной, относится к ситуации с разными сигнатурами
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:29 15
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
сказанное мной, относится к ситуации с разными сигнатурами
а я думал: к невозможности позвать функцию-член базового класса.
и кстати, сигнатуры у них разные.
0
1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,801
06.08.2015, 18:32  [ТС] 16
hoggy, получается, что компилятор различает одноименные функции по аргументам только в пределах одного класса. Но если одноименные функции с разным набором аргументов расположены в разных классах при наследовании, то компилятор будет использовать функцию наследуемого класса.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:35 17
Цитата Сообщение от Nishen Посмотреть сообщение
получается, что компилятор различает одноименные функции по аргументам только в пределах одного класса. Но если одноименные функции с разным набором аргументов расположены в разных классах при наследовании, то компилятор будет использовать функцию наследуемого класса.
ага. можно расшарить область видимости при помощи using.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
06.08.2015, 18:35 18
hoggy, не знаю, что ты за примеры придумываешь, но мне хватило информации из данной темы
Поясните утверждение из учебника
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 18:38 19
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
не знаю, что ты за примеры придумываешь, но мне хватило информации из данной темы
видимо вам не очень хватило.
0
castaway
06.08.2015, 18:41     Наследование
  #20

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2015, 18:41

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru