|
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 36
|
||||||
Как сделать, чтобы производный класс наследовал все операторы от родительского класса и от родительского родительского20.01.2021, 01:19. Показов 1890. Ответов 10
Есть 1й базовый класс в кот. определён operator ++ (); //prefix
Есть производный от 1го, 2й класс в кот. дополнительно определён operator -- (); //prefix Создаю 3й класс производный от 2го, в котором ещё определяю два оператора таких же но в postfix нотации operator ++ (int); // postfix и operator -- (int); // postfix Почему то от 1го ко 2му классу operator ++ (); //prefix нормально наследуется и работает, также, как новый operator -- (); //prefix , а вот в 3м работают только вновь определённые операторы: operator ++ (int); // postfix и operator -- (int); // postfix НО при этом от первых 2х классов операторы operator ++ (); //prefix и operator -- (); //prefix компилятор принимать отказывается! Т.е. обе префиксные формы в 3м классе перестают опознаваться. Как это поправить?
0
|
||||||
| 20.01.2021, 01:19 | |
|
Ответы с готовыми решениями:
10
Доступ к методу родительского класса из метода свойства родительского класса Как сделать, чтобы, при закрытии родительского, pop-up окно тоже закрывалось?
|
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,218
|
|||||||||
| 20.01.2021, 03:31 | |||||||||
1
|
|||||||||
|
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 36
|
||
| 20.01.2021, 06:39 [ТС] | ||
|
operator ++() в CountDn и так доступен объектам последнего без директивы using и без вставки scope resolution Counter::operator++(переменная) перед использованием оператора. Почему же в CounterFl она уже необходима? Ведь 2 раннее определённых оператора префиксной формы, по этой же логике должны быть унаследованы от CountDn и доступны в CounterFl? М.Б. есть какой то другой способ? Поясню. В главе по наследованию классов из книги, в кот. была эта задача (книга Лафоре) не было ни одного примера с using, и эта директива даже не упоминалась (кроме using namespace std). Были только вызовы родительских функций-членов через '::' scope resolution в определённых ситуациях в методах объектов производного класса. Поэтому догадаться о таком механизме "передачи" родительских операторов в производный класс, как [using ...] из пройденного материала совершенно не возможно. Должен быть способ без using... либо задача не согласуется с теоретическим материалом т.е. автором был пропущен кусок изложения. Тогда технически, если для постфиксной формы, инструкцию правильно писать так: using ИмяКласса::operator ++(int); ?
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||||||
| 20.01.2021, 07:53 | |||||||||
Чтобы сокрытия не происходило, а происходила перегрузка, надо префиксные формы "добавить" на тот же уровень видимости, где находятся постфиксные. Этим как раз и занимается using в данном случае.
1
|
|||||||||
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,218
|
|||||||
| 20.01.2021, 09:02 | |||||||
Сообщение было отмечено realalexandro как решение
Решениеfoo, то он "скрывает" все унаследованные члены по имени foo. Это означает, что унаследованные члены невозможно будет найти по неквалифицированному имени foo. Неквалифицированный поиск имени foo в области видимости класса-наследника будет видеть только его собственные члены foo. А чтобы получить доступ к "скрытым" унаследованным членам придется указывать их квалифицированные имена class::foo.CountDn нет метода по имени operator ++. Поэтому сокрытия не происходит и унаследованный Counter::operator ++ остается видимым и в классе CountDn.CounterFl его собственными операторами по имени operator ++ и operator --.CounterFl (например, с вызовом унаследованного внутри через квалифицированное имя), что, однако, будет еще более громоздко, чем using.using нет возможности выбора конкретного перегруженного метода. Он работает только огульно: вы указываете имя сущности и "раскрываете" все вариации этой сущности. Если это имя метода, то тем самым вы "раскрываете" все скрытые перегрузки этого метода. Если при этом в вашем классе уже есть явно объявленный метод с аналогичной сигнатурой, то "победит" он, то есть из-за using конфликта не возникнет.Хотите "раскрывать" скрытые методы индивидуально/выборочно - просто перереализуйте их в классе-наследнике явно.
2
|
|||||||
|
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 36
|
||||||||
| 20.01.2021, 09:38 [ТС] | ||||||||
|
А какую нибудь хорошую более современную книгу можете посоветовать?! Добавлено через 13 минут
Означает ли Ваша последняя фраза про аналогичную сигнатуру, что в приведённом коде инструкции ++cn1; и --cn1; на самом деле задействуют ПОСТфиксную форму, поскольку она заменяет в классе CounterFl те 2 префиксные, которые мы снова "де-маскируем" с помощью using? Или их сигнатура не считается аналогичной префиксным из первых 2х классов?
0
|
||||||||
| 20.01.2021, 09:43 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 36
|
||
| 20.01.2021, 09:43 [ТС] | ||
![]() Разве что тренировка самого объявления наследования с такими "костылями" в виде переопределения тех же операторов, которые ведут себя аналогично операторам род. класса.
0
|
||
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,218
|
||
| 20.01.2021, 10:16 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 36
|
|
| 20.01.2021, 10:20 [ТС] | |
|
TheCalligrapher, ну всё я усёк!
А на вопрос выше ответьте, пожалуйста.
0
|
|
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,218
|
||
| 20.01.2021, 11:23 | ||
++cn1 и --cn1 всегда вызывается именно префиксная форма. Если он по какой-то причине недоступна, то будет ошибка компиляции. Тихого вызова постфиксной формы в таких выражениях не будет никогда.
1
|
||
| 20.01.2021, 11:23 | |
|
Помогаю со студенческими работами здесь
11
Как вызвать функцию родительского класса?
Как использовать явный конструктор родительского класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
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, то после закрытия окошка. . .
|