|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
Вызов конструктора базового класса14.05.2019, 11:44. Показов 7989. Ответов 73
Метки нет (Все метки)
Приветствую всех. Создаю класс-наследник
std::string. У базового класса есть конструктор копии: std::string(const std::string& str). Правильно ли я создаю конструктор копии для своего класса?
std::string передаю объект типа IString.
0
|
||||||
| 14.05.2019, 11:44 | |
|
Ответы с готовыми решениями:
73
Вызов конструктора базового класса Вызов конструктора базового класса из порожденного Вызов конструктора базового класса из класса-наследника |
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
|||
| 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
|
||||||||
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
||
| 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
|
|
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
||
| 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 | |
|
Помогаю со студенческими работами здесь
60
Знакомство с наследованием. Вызов конструктора базового класса Вызов базового конструктора Вызвать конструктор производного класса без конструктора базового класса Наследование конструктора из базового класса Инициализация конструктора базового класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|