|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
Вызов конструктора базового класса14.05.2019, 11:44. Показов 8976. Ответов 73
Метки нет (Все метки)
Приветствую всех. Создаю класс-наследник
std::string. У базового класса есть конструктор копии: std::string(const std::string& str). Правильно ли я создаю конструктор копии для своего класса?
std::string передаю объект типа IString.
0
|
||||||
| 14.05.2019, 11:44 | |
|
Ответы с готовыми решениями:
73
Вызов конструктора базового класса Вызов конструктора базового класса из порожденного Вызов конструктора базового класса из класса-наследника |
|
Вездепух
13229 / 6861 / 1827
Регистрация: 18.10.2014
Сообщений: 17,393
|
|||
| 14.05.2019, 17:35 | |||
Сообщение было отмечено TheCalligrapher как решение
Решение+100 и призвано "на коленке" смоделировать "другой механизм распределения памяти". Именно из-за этого +100 механизм по умолчанию "подавится" неправильным указателем.B::operator delete вызван обычный ::operator delete.В типичной реализации задача вызова правильного operator delete для объекта в динамической памяти тоже возложена на виртуальный деструктор.
3
|
|||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
| 14.05.2019, 17:37 | |
|
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 14.05.2019, 17:48 [ТС] | |
|
Вот задал один вопрос, а столько полезного узнал! Теперь понятно, что наследоваться от класса, у которого нет виртуального деструктора, можно только в очень ограниченных случаях. Так как я планирую развивать создаваемый класс, то очевидно, что мне надо использовать композицию.
0
|
|
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||||||||
| 14.05.2019, 17:48 | ||||||||
operator delete хрякнулся,получив Ну отсюда и ошибка
0
|
||||||||
|
Вездепух
13229 / 6861 / 1827
Регистрация: 18.10.2014
Сообщений: 17,393
|
||
| 14.05.2019, 17:53 | ||
+100 можно было вызвать какой-нибудь платформенный VirtualAlloc или sbrk, или выделить память в каком-то своем рукописном пуле (последнее как раз и моделируется этим +100).
0
|
||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
| 14.05.2019, 17:55 | |
|
0
|
|
|
Вездепух
13229 / 6861 / 1827
Регистрация: 18.10.2014
Сообщений: 17,393
|
||
| 14.05.2019, 18:58 | ||
Сообщение было отмечено Croessmah как решение
РешениеCRTP не беспокоится ни о каких виртуальных деструкторах. std::enable_shared_from_this не беспокоится ни о каких виртуальных деструкторах. И т.д. и т.п.Поэтому не забивайте себе голову этими волшебными правилами, а просто помните, что объекты без виртуального деструктора не поддерживают полиморфного удаления. Если вас и не интересует поддержка полиморфного удаления, то наследуйтесь на здоровье, не беспокоясь ни о каких виртуальных деструкторах. Аргументы из разряда "а что, если кто-то сделает вот так" - это чушь. Если кто-то "сделает вот так" - сами виноваты будут. Добавлено через 2 минуты --- Вот здесь Почему деструктор срабатывает больше раз, чем количество созданных объектов? я уже описывал, как в реальности реализуется вызов правильного operator delete через посредство правильного деструктора.Современные реализации GCC подчиняются требованиям Itanium ABI, согласно которым, вместо одного параметризованного деструктора у класса должно быть два отдельных деструктора (там их на самом деле даже три может быть). То есть современная реализация в GCC отличается в деталях, но суть остается та же.
7
|
||
|
Комп_Оратор)
|
|||||||||||
| 14.05.2019, 22:12 | |||||||||||
|
Если плюсовый код не содержит UB - иди спать. Завтра с утра всё увидишь.
*** Уф-ф... Наконец-то всё прояснилось, а то уж начало казаться, что без виртуальных деструкторов - никуда. d7d1cd, соображения того плана, что delete на указателе базового класса (string) в вашем случае не сработает правильно, скорее всего вас не должны беспокоить. Поскольку вы не собираетесь использовать виртуальные методы, то вам и не предстоит создание коллекций полиморфных указателей. В этом случае беспокоиться не стоит. Если юзеру придёт в голову инициализировать указатель базового класса адресом наследника - это его проблема. Пусть кастит перед удалением или умрёт как мужчина. В конце концов в плюсах нет механизмов для запрета скастить любой указатель к void* а результат к чему то вовсе левому. А потом удалить. Хотя предусмотреть запрет на неявное преобразование указателя наследника к указателю базового класса в случае неполиморфного наследования можно было бы, наверное. Но не важно, важно, что чужая косорукость не ваша ответственность. А использование композиции защитит на уровне типа, но потребует много нудной писанины. Я бы предложил ещё вот какой вариант рассмотреть:
Добавлено через 8 минут Ну то есть, можно вообще обойтись без специализаций там где можно:
1
|
|||||||||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 15.05.2019, 08:37 [ТС] | |
|
Вот так дааа! TheCalligrapher, спасибо большое за ликбез! И вправду говорят, что С++ был придуман для того, чтобы хорошими программистами не становились случайные люди (вроде меня). Преклоняюсь пред Вашими знаниями данного предмета!
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 15.05.2019, 09:15 | |
|
d7d1cd, Если у базового класса нет виртуальных методов (а у std::string их нет, насколько мне известно), то крайне маловероятно что может понадобиться удаление через указатель на него, т.е. виртуальный деструктор. Идиотов, конечно хватает, но тратить время и силу на защиту от них в данном случае я бы не стал. Так что можешь смело вернуться к первоначальному варианту и не париться.
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 15.05.2019, 09:47 [ТС] | |
|
Тут еще один нюанс вскрылся. При наследовании надо описать только конструкторы. Все остальные функции базового класса будут видны из моего класса. Вот только операторы не будут работать. То есть, операторы все равно надо прописывать в своем классе. Как правильно сказал n1b1ru, может мне все методы и не нужны будут, поэтому можно применять композицию и предоставлять доступ только к нужным функциям базового класса.
Блин, уже запутался и не знаю что применить... Может вообще с нуля написать свой класс строки?
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||
| 15.05.2019, 09:52 | ||||
|
Добавлено через 1 минуту Добавлено через 53 секунды
1
|
||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||||
| 15.05.2019, 10:09 [ТС] | ||||||||
0
|
||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 15.05.2019, 10:12 | ||
|
Попробуй сделать str1 += str2;
0
|
||
|
Комп_Оратор)
|
||||||
| 15.05.2019, 10:17 | ||||||
0
|
||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||||||||
| 15.05.2019, 10:27 | ||||||||||||
Добавлено через 1 минуту Кстати, тоже работает
А вот так IString s3 = s2 + s; нет Добавлено через 28 секунд error C2440: 'initializing': cannot convert from 'std::basic_string<char,std::char_traits <char>,std::allocator<char>>' to 'IString' Добавлено через 4 минуты Похоже, надо явно определять IString(std::string &&s) : std::string(std::move(s)) {}
0
|
||||||||||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||||||||
| 15.05.2019, 11:05 | ||||||||
IString, надо определять свои операторы.
0
|
||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||
| 15.05.2019, 11:13 | |||
|
Добавлено через 1 минуту Добавлено через 36 секунд Тем более, это не move-конструктор
0
|
|||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 15.05.2019, 11:37 [ТС] | |
|
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 15.05.2019, 11:57 | |
|
0
|
|
| 15.05.2019, 11:57 | |
|
Знакомство с наследованием. Вызов конструктора базового класса Вызов базового конструктора Вызвать конструктор производного класса без конструктора базового класса Наследование конструктора из базового класса Инициализация конструктора базового класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|