0 / 0 / 0
Регистрация: 24.08.2017
Сообщений: 2

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

24.08.2017, 16:34. Показов 4199. Ответов 9

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
#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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.08.2017, 16:34
Ответы с готовыми решениями:

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

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

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

9
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
24.08.2017, 17:25
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
19458 / 10070 / 2452
Регистрация: 30.01.2014
Сообщений: 17,750
24.08.2017, 18:53
Лучший ответ Сообщение было отмечено shabbaranks как решение

Решение

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

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

shabbaranks, тогда можно делать ещё так.
Явно указывать оператор предка:
C++
1
2
Counter2 countOb;
countOb.Counter::operator++();
1
Неэпический
 Аватар для Croessmah
18128 / 10712 / 2063
Регистрация: 27.09.2012
Сообщений: 27,002
Записей в блоге: 1
24.08.2017, 19:51
Цитата Сообщение от anapshy Посмотреть сообщение
C++
1
countOb.Counter::operator++();
C++
1
++(Counter&)c1;
1
19458 / 10070 / 2452
Регистрация: 30.01.2014
Сообщений: 17,750
24.08.2017, 19:53
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 24.08.2017
Сообщений: 2
24.08.2017, 22:50  [ТС]
Спасибо, DrOffset, теперь понял)) по-моему это минус, который противоречит принципу перегрузки(
0
19458 / 10070 / 2452
Регистрация: 30.01.2014
Сообщений: 17,750
24.08.2017, 23:55
Цитата Сообщение от shabbaranks Посмотреть сообщение
по-моему это минус, который противоречит принципу перегрузки(
Нет, не противоречит. Перегружаются функции из одной области видимости, а у нас тут разные.
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
25.08.2017, 10:45
Цитата Сообщение от DrOffset Посмотреть сообщение
Ты и операторы точно так же вызвать можешь
Да это-то знал, но не думал, что оператор базового можно явно тоже вызывать, т.к. был 6мес убежден в том, что он не наследуется
0
806 / 533 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
25.08.2017, 10:48
shabbaranks, сразу видно что лафору читаешь, читай липпмана, там объяснен этот момент
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.08.2017, 10:48
Помогаю со студенческими работами здесь

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

Ссылка базового класса на объект производного класса
Граждане, объясните почему такое происходит. До того как проверил, думал, что если для ссылки базового класса запустить конструктор...

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

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

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


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

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

Новые блоги и статьи
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025
В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025
Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025
Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .
Конвейеры ETL с Apache Airflow и Python
AI_Generated 13.05.2025
ETL-конвейеры – это набор процессов, отвечающих за извлечение данных из различных источников (Extract), их преобразование в нужный формат (Transform) и загрузку в целевое хранилище (Load). . . .
Выполнение асинхронных задач в Python с asyncio
py-thonny 12.05.2025
Современный мир программирования похож на оживлённый мегаполис – тысячи процессов одновременно требуют внимания, ресурсов и времени. В этих джунглях операций возникают ситуации, когда программа. . .
Работа с gRPC сервисами на C#
UnmanagedCoder 12.05.2025
gRPC (Google Remote Procedure Call) — открытый высокопроизводительный RPC-фреймворк, изначально разработанный компанией Google. Он отличается от традиционых REST-сервисов как минимум тем, что. . .
CQRS (Command Query Responsibility Segregation) на Java
Javaican 12.05.2025
CQRS — Command Query Responsibility Segregation, или разделение ответственности команд и запросов. Суть этого архитектурного паттерна проста: операции чтения данных (запросы) отделяются от операций. . .
Шаблоны и приёмы реализации DDD на C#
stackOverflow 12.05.2025
Когда я впервые погрузился в мир Domain-Driven Design, мне показалось, что это очередная модная методология, которая скоро канет в лету. Однако годы практики убедили меня в обратном. DDD — не просто. . .
Исследование рантаймов контейнеров Docker, containerd и rkt
Mr. Docker 11.05.2025
Когда мы говорим о контейнерных рантаймах, мы обсуждаем программные компоненты, отвечающие за исполнение контейнеризованных приложений. Это тот слой, который берет образ контейнера и превращает его в. . .
Micronaut и GraalVM - будущее микросервисов на Java?
Javaican 11.05.2025
Облачные вычисления безжалостно обнажили ахиллесову пяту Java — прожорливость к ресурсам и медлительный старт приложений. Традиционные фреймворки, годами радовавшие корпоративных разработчиков своей. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru