|
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 36
|
||||||||||||
Наследование - вызов конструкторов и деструкторов01.11.2015, 02:04. Показов 6074. Ответов 53
Метки нет (Все метки)
Делаю два класса - предок и потомок:
Подскажите пожалуйста, почему во втором случае не вызвался деструктор класса-наследника??
0
|
||||||||||||
| 01.11.2015, 02:04 | |
|
Ответы с готовыми решениями:
53
Вызов лишних конструкторов и деструкторов в std::vector Задание с использованием конструкторов и деструкторов |
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|||||||
| 05.11.2015, 14:38 | |||||||
|
Fallenworld
Вот только у наследника больше обязанностей, так как класс предок ещё и супертип. Приходится и LSP соблюдать, если создаём методы с той же сигнатурой, и ещё на приватные методы смотреть. Добавлено через 4 минуты gromo Я не говорю, что не следует использовать C++... Но пытаться извернуться и исправить ошибки дизайна хаками -- не самый хороший путь. Что есть, то и используем. Более разумным кажется определять типы чисто-виртуальными функциями. Гораздо меньше проблем. Добавлено через 17 минут * * * Пример, что мы не можем полностью игнорировать то, как устроены "невиртуальные" методы базового класса.
0
|
|||||||
|
|
||
| 05.11.2015, 14:55 | ||
|
0
|
||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
| 05.11.2015, 14:59 | |
|
mporro, метода
private_hello не может не быть, ибо он объявлен в самом базовом классе. И почему у вас в Derived переопределение чисто виртуальной функции в чисто виртуальную?!
0
|
|
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|||
| 05.11.2015, 15:32 | |||
|
gromo
The bottom line is: нам необходимо знать, что метод Base::hello нельзя использовать, если не определён метод private_hello, нам необходимо знать детали реализации невиртуальных методов. А если бы мы сразу использовали чисто-виртуальный метод Base::hello, то подобных проблем у нас бы не возникло. Добавлено через 29 минут P.S. Я не спорю, что в определённых ситуациях нечто подобное может потребоваться. Может. Но! У non-virtual interfaces много ограничений и недостатков, а преимуществ очень мало. Их следует использовать только в специфических ситуациях, но никак не с такими претензиями, как рекламировал Саттер.
0
|
|||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
| 05.11.2015, 15:51 | |
|
mporro, так ведь невиртуальный метод
hello, как раз и предназначен, чтобы скрыть это. В нем проверяем все предусловия, инварианты и постусловия. Если на то пошло, то можно в самом базовом классе сделать безобидную заглушку для impl-метода (например, сделать его пустым), которая избавит вас от необходимости делать его пустым в своем подклассе, тобишь "вдаваться в детали".
0
|
|
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|||||||
| 05.11.2015, 17:06 | |||||||
|
gromo
То, что я вижу, и почему больше не пишу ничего подобного, это пародия на следующий паттерн:
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 07.11.2015, 11:35 | |||
|
и самой причине существования модификатора доступа private Добавлено через 1 минуту
0
|
|||
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
| 07.11.2015, 11:47 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 07.11.2015, 11:52 | ||
|
скорее всего вы даже не подозреваете об их существовании. но это не мешает вам продуктивно с ними работать. так и должно быть с грамотно сконструированным кодом. необходимость лазить в приваты - последствия вашего личного не совершенства в этом ужассном и реальном мире. и кстати, у вас там выше собственность предназначенная для наследников помечена как private а должна быть protected. косяк в дизайне и печалька.
0
|
||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
| 07.11.2015, 12:06 | |
|
0
|
|
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
||
| 07.11.2015, 12:22 | ||
|
Там чёрным по белому написано keep virtual functions private. Вся суть NVI в том, что Вы перегружаете не открытый контракт, а закрытый. А вот чтобы перегружать закрытый контракт, Вам придётся в него "втыкать".
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 07.11.2015, 12:47 | |||
|
имя функции-члена тоже доставляет: "переопределяйте детали реализации"
0
|
|||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||
| 07.11.2015, 12:49 | ||
|
Почти вся стандартная библиотека построена на этой идиоме. Еще часто применяют префикс `do_`. Публичная интерфейсная функция request(), рабочая функция — do_request(), что я нахожу более привлекательным нежели `private_`, но кому как нравится
0
|
||
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
| 07.11.2015, 12:51 | |
|
hoggy
Сначала, пожалуйста, ознакомьтесь со статьёй Саттера. Только после этого отвечайте по теме NVI. Вопросы, которые Вы пытаетесь адресовать мне, следует адресовать Саттеру.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 07.11.2015, 13:02 | ||
|
если существует объективная причина не позволить наследнику выполнить прямой вызов виртуальной функции базового класса, хотя на вскидку, мне трудно представить зачем такое может понадобиться. во всем остальном приватные виртуальные функции-члены не дают никаких преимуществ, по сравнению с protected только с толку сбивают. потому что protected - это то, что доктор прописал специально для наследников. а private - частная собственность.
0
|
||
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
| 07.11.2015, 13:04 | |
|
hoggy
Мне то зачем это рассказывать? Расскажите это Саттеру.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 07.11.2015, 13:21 | |||
|
вы приводите в качестве аргумента некий авторитет: Саттера. но понимаете ли вы его? или вы бездумно верите авторитетам? вы осознаете, зачем нужно делать виртуальные-функции члены приватными? я читал Саттера если что. и мне нет смысла ему что-то рассказывать. потому что подобный тезис:
разница между моим подходом, и подходом Саттера заключается лишь в одном: я четко разделяю, что есть частная собственность, а что предназначено для наследников. Саттер же стремится в принципе выполнить максимально жесткий контракт. он стремится сделать приватным все, что только возможно. и не делает приватным лишь то, что объективно необходимо сделать не приватным. что на мой взгляд ухудшает читабельность, и не несет профита.
0
|
|||
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
| 07.11.2015, 13:25 | |
|
hoggy
Тогда мой Вам ответ состоит в том, что втыкать придётся не только в открытый контракт, который случайно может быть нарушен наследником, но ещё в защищённый (protected) контракт, который тоже нужно соблюдать. Зачем мне нужна эта лишняя деталь защищённого контракта? Замена private на protected не решает проблемы лишней детали.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 07.11.2015, 13:36 | ||||
|
реализация его не интересует. что бы разработчик наследника в него втыкал, и соблюдал. что бы корректно унаследоваться и породить наследника.
0
|
||||
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|||
| 07.11.2015, 13:56 | |||
|
Потому внедрение protected контракта -- это уже излишне. Зачем? Я привёл пример, когда мне необходима информация о том, что определённый невиртуальный метод использует определённый виртуальный. А в жизни таких ситуаций может быть ещё больше. Сомневаюсь, что Саттер строго доказал, что таких ситуаций нет. Кроме того, меня по-прежнему будут волновать аксиомы интерфейса. Я вполне могу написать в Derived классе свой метод hello, который будет успешно работать для подалгебры Derived и не удовлетворять аксиомам Base, если не буду знать аксиом Base. То есть, NVI не может меня избавить от необходимости подробно втыкать в открытый интерфейс. Итог: вместо того, чтобы втыкать только в открытый интерфейс, как с обычным наследованием, я должен ещё и разобрать защищённый.
0
|
|||
| 07.11.2015, 13:56 | |
|
Порядок вызова конструкторов/деструкторов Правильное использование конструкторов и деструкторов Разработка классов, создание конструкторов и деструкторов Ошибки в программе с использованием конструкторов/деструкторов Как реализовать набор конструкторов и деструкторов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|