Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
shabbaranks
0 / 0 / 0
Регистрация: 24.08.2017
Сообщений: 2
1

Почему объект производного класса не видит префиксный оператор из базового класса?

24.08.2017, 16:34. Просмотров 1041. Ответов 9

Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его затюнинговать, сделал ему производный класс с перегруженным постфиксным оператором ++. После этого объект производного класса перестал видеть префиксный оператор из базового класса( Никак не могу понять почему он его не видит?
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
#include<iostream>
using namespace std;
class Counter
{
protected:
    int count;
public:
    Counter()
    {
        count = 0;
    }
    void operator++()
    {
        ++count;
    }
};
class Counter2 : public Counter
{
public:
    Counter2(): Counter()
    {}
    void operator++(int)
    {
        count++;
    }
};
int main()
{
    Counter2 c1;
    [COLOR="Red"][U]++[/U][/COLOR]c1;
}
Добавлено через 10 минут
в строчке 30) ++c;
это и подчеркивает компилятор
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2017, 16:34
Ответы с готовыми решениями:

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект...

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; }...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?
я хотел так, но программа просто падает void Student::add(Base** head) { cout &lt;&lt; &quot;I here&quot; &lt;&lt;...

Отрабатывает оператор базового, а не производного класса
Здравствуйте! Собственно, вопрос в следующем. Я перегрузил оператор потокового вывода для базового...

Наследование: почему вызывается метод базового класса, а не производного?
Всем привет, такой вопрос, почему вызывается в данном коде метод базового класса, а не производного...

9
anapshy
255 / 236 / 200
Регистрация: 14.11.2016
Сообщений: 892
Завершенные тесты: 3
24.08.2017, 17:25 2
shabbaranks, наследование класса подразумевает только наследование переменных и функций-методов класса, но не как не операторы для работы с ними.
Используй динамическое приведение типов вверх по иерархии классов.
В случае если приведение не возможно dynamic_cast вернет NULL.
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>
 
class Counter
{
protected:
    int count;
public:
    Counter() : count(0) {}
    int get() { return count; }
    void operator++() { ++count; }
};
 
class Counter2 : public Counter
{
public:
    Counter2(): Counter() {}
    void operator++(int) { count++; }
};
 
int main()
{
    Counter *countOb = new Counter2();
    ++(*dynamic_cast<Counter*>(countOb));
    /*
        Counter *ptr_countOb = dynamic_cast<Counter*>(countOb);
        if (ptr_countOb != NULL)
        {
            ++(*prt_countOb);
            std::cout << ptr_countOb->get() << std::endl;
        }
    */
    std::cout << countOb->get() << std::endl;
    delete countOb;
}
0
DrOffset
10909 / 5809 / 1431
Регистрация: 30.01.2014
Сообщений: 9,351
24.08.2017, 18:53 3
Лучший ответ Сообщение было отмечено shabbaranks как решение

Решение

Цитата Сообщение от shabbaranks Посмотреть сообщение
Никак не могу понять почему он его не видит?
Наследование, счетчик, перегрузка операций: К префиксным операциям нет доступа

Добавлено через 12 минут
Цитата Сообщение от anapshy Посмотреть сообщение
наследование класса подразумевает только наследование переменных и функций-методов класса, но не как не операторы для работы с ними.
Если не секрет, где такое написано?
Больше всего интересует почему операторы-члены класса не считаются функциями-членами класса.
1
anapshy
255 / 236 / 200
Регистрация: 14.11.2016
Сообщений: 892
Завершенные тесты: 3
24.08.2017, 19:46 4
DrOffset, ааа Lool В некоторых книгах пишут "... наследуются переменные и функции-методы / функции-члены класса".
Понимал так, что функции-методы - это функции класса которые можно вызвать для объекта MyClass.func(), или MyClass->func(), либо закрытые функции.
Мда... Вот это прикол узнать правду спустя 6 мес.

shabbaranks, тогда можно делать ещё так.
Явно указывать оператор предка:
C++
1
2
Counter2 countOb;
countOb.Counter::operator++();
1
24.08.2017, 19:46
Croessmah
++Ͻ
15812 / 8947 / 1719
Регистрация: 27.09.2012
Сообщений: 21,984
Записей в блоге: 2
Завершенные тесты: 2
24.08.2017, 19:51 5
Цитата Сообщение от anapshy Посмотреть сообщение
C++
1
countOb.Counter::operator++();
C++
1
++(Counter&)c1;
1
DrOffset
10909 / 5809 / 1431
Регистрация: 30.01.2014
Сообщений: 9,351
24.08.2017, 19:53 6
Цитата Сообщение от anapshy Посмотреть сообщение
Понимал так, что функции-методы - это функции класса которые можно вызвать для объекта MyClass.func(), или MyClass->func()
Ты и операторы точно так же вызвать можешь
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
    A & operator++() { return *this; }
};
 
int main()
{
    A a;
    a.operator++(); //!!!
}
0
shabbaranks
0 / 0 / 0
Регистрация: 24.08.2017
Сообщений: 2
24.08.2017, 22:50  [ТС] 7
Спасибо, DrOffset, теперь понял)) по-моему это минус, который противоречит принципу перегрузки(
0
DrOffset
10909 / 5809 / 1431
Регистрация: 30.01.2014
Сообщений: 9,351
24.08.2017, 23:55 8
Цитата Сообщение от shabbaranks Посмотреть сообщение
по-моему это минус, который противоречит принципу перегрузки(
Нет, не противоречит. Перегружаются функции из одной области видимости, а у нас тут разные.
0
anapshy
255 / 236 / 200
Регистрация: 14.11.2016
Сообщений: 892
Завершенные тесты: 3
25.08.2017, 10:45 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Ты и операторы точно так же вызвать можешь
Да это-то знал, но не думал, что оператор базового можно явно тоже вызывать, т.к. был 6мес убежден в том, что он не наследуется
0
Ferrari F1
795 / 524 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
25.08.2017, 10:48 10
shabbaranks, сразу видно что лафору читаешь, читай липпмана, там объяснен этот момент
1
25.08.2017, 10:48
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2017, 10:48

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp,...

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний...

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса -...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.