|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
Вызов конструктора базового класса14.05.2019, 11:44. Показов 8335. Ответов 73
Метки нет (Все метки)
Приветствую всех. Создаю класс-наследник
std::string. У базового класса есть конструктор копии: std::string(const std::string& str). Правильно ли я создаю конструктор копии для своего класса?
std::string передаю объект типа IString.
0
|
||||||
| 14.05.2019, 11:44 | |
|
Ответы с готовыми решениями:
73
Вызов конструктора базового класса Вызов конструктора базового класса из порожденного Вызов конструктора базового класса из класса-наследника |
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
| 14.05.2019, 13:12 | |
|
2
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 14.05.2019, 13:15 | ||
|
Тут важно соблюдать правила, чтоб у тебя это закрепилось на уровне рефлексов.
1
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 14.05.2019, 13:21 [ТС] | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||
| 14.05.2019, 13:25 | |||||||||||||||||||
|
у которого отсутствует виртуальный деструктор, то поведение не определено. UB в действии: https://rextester.com/XMEVIJ77333
если у наследника нет своих собственных членов-данных. то есть, если sizeof(der) == sizeof(base),тогда проблем не будет. а если программист ничайно позабудет - ему компилятор напомнит.
3
|
|||||||||||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|||||||
| 14.05.2019, 13:28 | |||||||
|
Вместо композиции можно использовать закрытое наследование, с выделением нужных функций из базового класса, например:
1
|
|||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 14.05.2019, 13:28 | ||
|
0
|
||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||
| 14.05.2019, 13:33 | ||
![]() В стандарте не вижу исключений, такого рода.
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||
| 14.05.2019, 13:39 [ТС] | ||||
int или char). Но ведь освобождение памяти, занятое ими, будет проходить без проблем?..![]()
0
|
||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||
| 14.05.2019, 13:44 | |||
|
"Ты пишешь код и выражаешь мысль, современный код это и инструкции для процессора ( в конечном счете) и роман для другого программиста. Поэтому как роман составленный из шаблонов из методички будет смотреться "не очень", так и программа, наполненная бездумно вставленным кодом, обоснование которому "так принято", - тоже.". Не вижу что бы вы следовали особо каким-то принципам, например, SOLID?
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||
| 14.05.2019, 13:53 | ||
|
Да и принципа такого нет. Есть общая рекомендация, которую выработали для общего случая. Однако в частном случае ее можно и не применять - если это обосновано.
1
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||
| 14.05.2019, 13:57 | |||||||||
|
если нет виртуального деструктора, то случится две вещи: 1. деструктор наследника не будет запущен. 2. за размер куска памяти, который нужно освободить, будет принят sizeof(object) удаляемого объекта.выше я привел пример, где случился краш. почему случился краш? причина - множественное наследование. получилось так, что delete попыталась освободить только часть памяти,(удалить один из подобъектов) вместо того, что бы освободить всю память, которая была захвачена у системы посредством new.так делать нельзя. нельзя запросить целое, а вернуть только половину. если у класса нет собственных членов-данных, стало быть размер наследника совпадает с размером базового класса, следовательно new/delete априори будет аллоцировать/освобождать тот же самый кусок памяти, даже с учетом множественного наследования. убираем данные-члены из классов, и вуаля! проблем никаких.
у конкретного наследника ещё ничего не гарантирует. важно, что бы либо не было множественного наследования, либо классы-участники в множественном наследовании так же не имели данных-членов. короче, смысл простой: нужно гарантировать что удаляется тот же самый кусок памяти, что был захвачен при помощи new Добавлено через 1 минуту или ты сейчас сможешь ответить на вопрос: "почему не есть хорошо?"
4
|
|||||||||
|
Неэпический
|
||
| 14.05.2019, 14:08 | ||
|
Речь-то о том, что подобный код приводит к неопределенному поведению. Код с UB может вполне нормально работать, однако UB как было, так и остается.
0
|
||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||
| 14.05.2019, 14:09 | |||
|
Остальное на свой риск, как всегда?)
0
|
|||
|
Неэпический
|
||
| 14.05.2019, 14:11 | ||
|
UB на то и UB, что никаких гарантий со стороны стандарта нет. Всё что без гарантий - всегда на свой страх, риск, опыт, знание реализации.
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
| 14.05.2019, 15:14 [ТС] | ||||||
|
Уфф! Здорово! Спасибо за информацию всем!
Мне непонятен следующий момент. Есть базовый класс без виртуального деструктора, а так же есть наследник этого класса с полем простого типа. Произойдет ли корректное освобождение памяти, занятой этим полем, в следующем коде:
0
|
||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 14.05.2019, 15:36 | |||||||
0
|
|||||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
| 14.05.2019, 15:56 | |
|
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 14.05.2019, 16:11 [ТС] | |
|
То есть, мои слова о том, что в созданном по умолчанию деструкторе нет кода, неверны. Там есть код освобождения памяти, которую занимали поля класса. Я все правильно понимаю?
0
|
|
|
Вездепух
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,238
|
|||||||||||||
| 14.05.2019, 17:19 | |||||||||||||
Сообщение было отмечено d7d1cd как решение
Решение
sizeof(A) == sizeof(B). Однако хрясь
A и - о чудо - вдруг все заработало!Добавлено через 4 минуты
1
|
|||||||||||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||
| 14.05.2019, 17:25 | |||
B::operator delete не будет вызван?
0
|
|||
| 14.05.2019, 17:25 | |
|
Помогаю со студенческими работами здесь
40
Знакомство с наследованием. Вызов конструктора базового класса Вызов базового конструктора Вызвать конструктор производного класса без конструктора базового класса Наследование конструктора из базового класса Инициализация конструктора базового класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|