|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
Вызов конструктора базового класса14.05.2019, 11:44. Показов 8746. Ответов 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
|
|||||||||||||||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||||||
| 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
|
|||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||
| 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
|
|
|
Вездепух
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,315
|
|||||||||||||
| 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 | |
|
Знакомство с наследованием. Вызов конструктора базового класса Вызов базового конструктора Вызвать конструктор производного класса без конструктора базового класса Наследование конструктора из базового класса Инициализация конструктора базового класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Video:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|