Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
2 / 2 / 0
Регистрация: 14.07.2011
Сообщений: 49

Вопрос по наследованию

09.11.2011, 17:48. Показов 5260. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уже неоднократно перечитывал главы про наследования и все равно до конца не разобрался.
Вот например у нас есть класс Четырехугольник, и мы создаем класс Прямоугольник.
И в том и в другом классе есть функции Площадь и если у них будет одинаковая сигнатура, то вызовется функция того класса, объект которого мы создали. Если же сигнатуры совпадать не будут, то нужно явно указать с помощью оператора ::.
Если мы сделаем функцию площади виртуальной, то при одинаковых сигнатурах вызовется функция своего класса. То же в случае разных сигнатур. То есть единственный плюс объявления функций виртуальными, это то что если мы создадим указатель на объект базового класса, он сможет указывать и на объект производного класса?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2011, 17:48
Ответы с готовыми решениями:

Вопрос по наследованию
Вопрос насчёт передачи аргументов в конструктор базового класса(создания временного объекта), а именно почему у меня это не выходит и где у...

вопрос по наследованию
начал изучать ООП в РНР. нужно уточнение. имеется класс статей Aticle и дочерний класс NewsArticle, они отличаются тем что у второго...

Вопрос по наследованию
Вывод Hello СHild Hello Base Что сделать чтобы Base не выводило при подобном вызове? using System; namespace...

52
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
10.11.2011, 20:30
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от LosAngeles Посмотреть сообщение
Переключаем версию на релиз и нет никаких ассертов, что мы получаем?
Как бы игнорирование ошибки не есть её исправление...
Отключать ассерты в релизе не есть хорошо. Стандартный ассерт УГ, сакс и фтопку.
0
Заблокирован
10.11.2011, 20:35
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ведь согласись, что следующая реализация метода не может быть у квадрата
Да, не может. Поэтому, квадрат можно отнаследовать от прямоугольника, но нельзя отнаследовать от кирпича.

Если ваш манипулятор ожидает на входе кирпич, то он и должен принимать только кирпичи, а не все мыслимые и не мыслимые прямоугольники.

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

Если манипулятор не делает различий между кирпичом и квадратом, но в рантайме ломает все квадраты - это архитектурный фейл.

Проектирование по принципу: "Я не запрещаю тебе быть квадратом, но если ты реально окажется квадратом, то я заломаю нафег всю программу"

Это проектирование по принципу: "Здесь, здесь и здесь я закопаю мину. Специально, что бы взрывать полностью работоспособный процесс".

Добавлено через 2 минуты
Цитата Сообщение от LosAngeles Посмотреть сообщение
Переключаем версию на релиз и нет никаких ассертов, что мы получаем?
Кашу в голове, и мину замедленного действия в коде мы получаем. И программиста, который не вполне себе осознает, для чего вообще существуют ассерты
1
10.11.2011, 20:37

Не по теме:

Bers, зачетные цитаты.

0
Заблокирован
10.11.2011, 20:39
Цитата Сообщение от Deviaphan Посмотреть сообщение
Совершенно верно! Метод должен называться MakeWidthBigger и тогда он становится правильным. С данным названием он недоопределён и его поведение зависит от фактического типа объекта, что не есть хорошо.
нет, от изменения названия он правильнее не станет ни на йоту. Я вправе ожидать от квадрата, что его стороны будут равны друг другу в любой момент времени, а не подбирать функцию исходя из её названия(что за лол?) и гадать, а не приведёт ли она квадрат в противоречивое состояние, что в случае наследования от прямоугольника сделать легко. Так что если найдётся хоть один способ привести квадрат в противоречивое состояние через его же интерфейс, значит вся иерархия тухлая.
0
Заблокирован
10.11.2011, 20:41
Цитата Сообщение от Deviaphan Посмотреть сообщение
но реализация полиморфизма никак не регламентирована и разработчики компиляторов вольны реализовывать его как им вздумается. Поэтому о "низкоуровневой" реализации лучше даже и не задумываться. Только если с привязкой к компилятору.
Ну как бы, на самом деле и не нужно об этом задумываться. Нужно просто понимать, как он должен работать.

Главный принцип: указатель базового типа запустит метод потомка, если сам указатель будит указывать на этого потомка, а сам метод будит виртуальным.

Если метод будит не виртуальным, запустится базовый метод.

По моему, вполне достаточно для понимания)
0
Заблокирован
10.11.2011, 20:41
Цитата Сообщение от Bers Посмотреть сообщение
Кашу в голове, и мину замедленного действия в коде мы получаем. И программиста, который не вполне себе осознает, для чего вообще существуют ассерты
всё это на мыло мейерсу скинить и его боссу, давно пора уволить этого идиота, а книжки сжечь!
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
10.11.2011, 20:43
Цитата Сообщение от Bers Посмотреть сообщение
Поэтому, квадрат можно отнаследовать от прямоугольника
Ну как может-то?
Есть метод изменения ширины, который должен изменять ширину. В квадрате же он должен синхронно изменять и высоту. Метод "ИзменитьШирину", который изменяет высоту это ведь не правильно. С этим ты готов согласиться? Это нарушение логики. Т.е. для квадрата методы ЗадатьШирину и ЗадатьВысоту должны быть закрыты и вместо них должен быть добавлен метод ЗадатьРазмер. Т.е. квадрат не является прямоугольником с точки зрения интерфейса (с точки зрения геометрии, разумеется, он является прямоугольником и четырёхугольником), и если и можно его наследовать, то только закрытым наследованием от rectangle.
0
Заблокирован
10.11.2011, 20:43
Цитата Сообщение от LosAngeles Посмотреть сообщение
всё это на мыло мейерсу скинить и его боссу, давно пора уволить этого идиота, а книжки сжечь!
Вы путаете себя с Майерсом! Не надо себя отождествлять с Майерсом. Старайтесь говорить от себя лично и приводить конкретные примеры, которые убеждают в вашей правоте.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
10.11.2011, 20:46
Цитата Сообщение от LosAngeles Посмотреть сообщение
он правильнее не станет ни на йоту
Станет. В нём будет разрешено изменение ширины и запрещено изменение высоты. Что будет соответствовать названию. Слово СделатьБольше не уточняет, каким именно образом он будет становиться больше, поэтому запрет изменения высоты не корректен.

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
о моему, вполне достаточно для понимания
Абсолютно да.) Просто слово "низкоуровневое" наводит на более глубокие изыскания.)
0
Заблокирован
10.11.2011, 21:02
Цитата Сообщение от Deviaphan Посмотреть сообщение
Есть метод изменения ширины, который должен изменять ширину. В квадрате же он должен синхронно изменять и высоту. Метод "ИзменитьШирину", который изменяет высоту это ведь не правильно. С этим ты готов согласиться? Это нарушение логики. Т.е. для квадрата методы ЗадатьШирину и ЗадатьВысоту должны быть закрыты и вместо них должен быть добавлен метод ЗадатьРазмер. Т.е. квадрат не является прямоугольником с точки зрения интерфейса
Я не согласен.
Для прямоугольника: Изменяем высоту - изменится высота.
Изменяем ширину - изменится ширина.

Для квадрата - изменяем хоть ширину, хоть высоту. Все равно запускается родной для квадрата метод "изменить размер"

То есть метод "изменить ширину" для квадрата такой же правомерный, как и для любого другого прямоугольника. Но реализация метода отличается тем, что для квадрата изменится не только ширина, но и высота.

Я имею полное право изменить ширину квадрата. Что мне мешает это сделать?
Я не имею права для квадрата изменить ширину, а высоту оставить прежней. Но об этом контракте позаботится сам квадрат. Его реализации методов "изменить ширину/высоту".

Для прямоугольника метод "изменить ширину" - изменит ширину фигуры.
При этом, может изменится и высота, если фигура - квадрат. Что здесь нелогичного?

Я хочу сказать, что у прямоугольника при изменении ширины, высота не обязана сохранять прежнее значение.

Вы можете сказать: но это тупо! Зачем квадрату вообще иметь методы "изменить ширину/высоту", если идеологически ему нужен только один метод "ИзменитьРазмер" ?

Тут я с вами соглашусь полностью. Для квадрата первые два интерфейса кажутся излишними.
Но это - зависит от архитектурного решения. Такое решение может быть не самое красивое, с точки зрения минимализма, но вполне приемлимое.

Об этом и пишет Маерс (я по крайней мере так его понял) - о том, что оо-программирование, это в первую очередь программирование в терминах интерфейсов.

И при установлении различных отношений между классами, в первую очередь нужно согласовывать интерфейсы предков и потомков, что бы не получилось "аляписто".

Что бы не пришлось на некоторые методы вообще ставить заглушки (метод как бы есть, а использовать его нельзя).

Что бы не получилось что методов больше, чем требуется объекту по смыслу.

Хотя пример для иллюстрации он привел фейловый

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
Абсолютно да.) Просто слово "низкоуровневое" наводит на более глубокие изыскания.)
ну это я так, понтануццо просто хотел))
Заодно интересную ссылку народу предоставил)

0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
10.11.2011, 21:31
Цитата Сообщение от Chelioss Посмотреть сообщение
С указателями понятно. Без виртуальности будет вызываться метод класса Base, потому что тип указателя - Base.
Но не понятно, почему A.call() вызывает метод f() класса Base, если объект A имеет тип Derived, в котором метод f() переопределен.
Вот пример, где вызывается именно метод класса Derived.
В моем примере написано: A.Call(); Который НАСЛЕДУЕТСЯ и НЕ ПЕРЕОПРЕДЕЛЯЕТСЯ.
Этот A.Call() и вызывает внутри себя базовый метод f(), который не виртуальный.
А если сделать f() виртуальным, то A.Call() будет вызывать f() по типу объекта А.
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
10.11.2011, 22:35
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
В моем примере написано: A.Call(); Который НАСЛЕДУЕТСЯ и НЕ ПЕРЕОПРЕДЕЛЯЕТСЯ.
Call() нет, а f() переопределяется. Не совсем очевидно, почему вызывается f класса Base, если f переопределена.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
11.11.2011, 08:44
Цитата Сообщение от Chelioss Посмотреть сообщение
Call() нет, а f() переопределяется. Не совсем очевидно, почему вызывается f класса Base, если f переопределена.
Вот это и есть самое важное в понимании виртуальных функций...
Потому как при трансляции базового класса компилятор НИФИГА не знает о наследниках. Поэтому НАМЕРТВО связывает CALL со своей f() ПРИ КОМПИЛЯЦИИ.

Если же мы пишем virtual, то это мы подсказываем компилятору: погоди намертво связывать, наследники будут. И компилятор формирует код, который связывает вызов ПРИ ВЫПОЛНЕНИИ программы...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2011, 08:44

По наследованию
Решил заняться паттернами проектирования и возник вопрос. Допустим есть абстрактный класс public abstract class First { ...

Непонятка по наследованию
Объясните пожалуйста такой момент. Ниже приведу код программы результат ее работы два сообщения: "Поле y=0 Поле y=228 ". Не...

Вопросы по наследованию
Вопрос ещё по конструкторам Допустим есть система классов class A { public: A() {} }; class B: public A {

Работа в Eclipse по наследованию
Создать абстрактный класс Строение (в качестве свойств использовать координаты, количество окон и дверей). Создать массив объектов...

Задачка по наследованию классов
Вот само задание:https://stepik.org/lesson/24462/step/7?unit=6768 Вот мой код: # Заполнение массива n = int(input()) d = {} ...


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

Или воспользуйтесь поиском по форуму:
53
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru