|
|
||||||||||||
В C++ метод производного класса всегда переопределяет метод базового класса?30.07.2019, 00:50. Показов 7001. Ответов 22
Метки нет (Все метки)
Carp::Swim этот метод хоть и не содержит ключевого слова override, всё равно переопределяет метод базового класса. В C#, например, можно объявить метод не написав override и это не будет считаться переопределением, это будет сокрытием. Если я через ссылку типа базового класса вызову метод Swim, то тот самый метод без override будет проигнорирован и вызовется метод базового класса. Я всё верно понял?C# Кликните здесь для просмотра всего текста
0
|
||||||||||||
| 30.07.2019, 00:50 | |
|
Ответы с готовыми решениями:
22
Вызов метода производного класса через обращение к методу базового класса |
|
Модератор
|
||
| 30.07.2019, 01:28 | ||
|
Во первых, есть final.
https://docs.microsoft.com/ru-... dvs.120%29 Во вторых override нужен только что бы компилятор мог выругаться если в базовом классе точно такого метода нет.
1
|
||
|
|
|||||
| 30.07.2019, 01:33 [ТС] | |||||
. В общем, редактировал сообщение, получилось непонятно.
1
|
|||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||||||||||
| 30.07.2019, 02:01 | |||||||||||
|
Casper-SC, для не-vitual методов используется просто определение, либо отсутствие определения метода. Если у класса метод не определен, то используется метод ближайшего по иерархии вверх родителя. Кроме того, для любого экземпляра класса всегда можно вызвать метод требуемого родительского класса (это не зависит от виртуальности):
override тоже в общем-то ни на что не влияет, и введён только затем, чтобы при случайном удалении слова virtual у какого-то из родительских классов в дочернем возникала ошибка компилятора, показывающая необходимость именно виртуального способа вызова.
2
|
|||||||||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||||||||||
| 30.07.2019, 02:13 | |||||||||||
|
И ещё, по коду выше, насчёт виртуального деструктора. Он наследующим классам не передаётся, потому если нужно удалять объект на основе указателя на родительский класс, т.е. по принципу
virtual ~Carp() = default; объявлять обязательно, и всем классам выше по иерархии тоже! В противном случае для корректного удаления обязательно при удалении явно преобразовывать тип в тот, которым он создавался.Наподобие
1
|
|||||||||||
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
| 30.07.2019, 03:48 | |
|
1
|
|
|
|
|||
| 30.07.2019, 09:51 [ТС] | |||
|
http://cpp-reference.ru/articl... estructor/
0
|
|||
|
Комп_Оратор)
|
||
| 31.07.2019, 11:18 | ||
|
0
|
||
|
|
|||
| 31.07.2019, 21:24 [ТС] | |||
|
0
|
|||
|
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
|
||||||||||||
| 31.07.2019, 21:53 | ||||||||||||
0
|
||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 31.07.2019, 23:21 | |
|
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 31.07.2019, 23:30 | |
|
hoggy, ты уже третий, указывающий на эту мою ошибку. Да, я действительно всегда считал, что виртуальность деструктора не наследуется. Признаю свою ошибку.
0
|
|
|
Комп_Оратор)
|
||||||
| 01.08.2019, 00:47 | ||||||
|
Но если кратко, то мой ответ на вопрос топика: Могут быть методы которых вообще нет в базовом классе. По примеру, - метод совпадающий по сигнатуре с виртуальным, - всегда переопределение, да. override - подсказка компилятору о том, что вы намереваетесь этим методом перегрузить метод в базовом классе. Это спасёт, например, если вы ошибётесь в сигнатуре и не заметите этого. Беда будет (без override) не только в том, что вы не получите переопределения. Вы потеряете сам оригинал виртуального метода в наследнике.
1
|
||||||
|
Модератор
|
||
| 01.08.2019, 01:04 | ||
|
Хуже, если метод повторить в наследнике не предполагая что у базового уже есть такой виртуальный. Такое возможно, особенно, с короткими именами и простыми сигнатурами. Интересно, есть ли в каких ни будь компиляторах флаг включающий предупреждение для таких случаев?
0
|
||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 01.08.2019, 01:35 | ||
|
1
|
||
|
Комп_Оратор)
|
||||||||
| 01.08.2019, 09:25 | ||||||||
переопределить! "перегрузить" - тут совершенно неуместно. Интересно читать утром то, что ночью пишешь.Добавлено через 18 минут
2
|
||||||||
|
|
|||||||
| 01.08.2019, 20:07 [ТС] | |||||||
using Base::foo; и ничего не придётся переопределять явно.Работает:
1
|
|||||||
|
Комп_Оратор)
|
||
| 01.08.2019, 20:20 | ||
|
0
|
||
| 01.08.2019, 20:20 | |
|
Помогаю со студенческими работами здесь
20
Как сложить объект базового класса с объектом производного(наследуемого класса)
Указатель на объект базового класса и адрес объекта производного класса Вызвать конструктор производного класса без конструктора базового класса Возможно ли указатель производного класса инициализировать объектом базового класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера 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 с альфа-каналом (с прозрачным. . .
|