2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
||||||
1 | ||||||
Виртуальные методы без деструкторов07.08.2019, 06:03. Показов 2152. Ответов 34
Метки нет (Все метки)
Знаю что хочу странного, но все же. Можно ли как-то объявить класс с виртуальными методами. но без деструктора и чтоб компилятор не плевался варнингами? Средствами языка, а не отключив варнинги в компиляторе.
Предупреждая вопрос нафиг надо - хочу выделять память из пула, а потом вместо удаления отдельных объектов, грохнуть сам пул. Разумеется, чтобы это сделать, нужно чтобы все объекты были trivially destructible. А для этого у них не должно быть никакого деструктора. Предупреждая возражение "а вдруг случайно какому-то потомку не тривиальный деструктор добавишь" - а я static_assert подопру.
1
|
07.08.2019, 06:03 | |
Ответы с готовыми решениями:
34
Виртуальные методы Виртуальные методы Виртуальные методы виртуальные методы |
Модератор
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
|
|
07.08.2019, 07:21 | 2 |
0
|
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||
07.08.2019, 09:14 | 3 | |||||
Можно не подпирать, он у тебя union не даст создать в этом случае.
А какие у тебя ворнинги выдаёт? Добавлено через 2 минуты Сделай тогда уж
0
|
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
07.08.2019, 09:51 | 5 |
И какой из типов туда передавать?
Добавлено через 7 минут А, ну да, ту да же размер передаётся. Тогда да, лучше вместо AnyChild использовать std::aligned_storage<std::max(sizeof(FirstChild), sizeof(SecondChild))>
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
07.08.2019, 10:26 | 7 | |||||
Сообщение было отмечено Renji как решение
Решение
нет.
хорошая новость в том, что не нужно отключать ворнинг насовсем. его можно отключить точечно. https://rextester.com/LIAM80123
2
|
Комп_Оратор)
|
|
07.08.2019, 10:35 | 8 |
Renji, вопрос: а зачем union? Не лучше ли уже создавать
unsigned char* блок. Размер наиболее протяженного потомка легко выясняется во время компиляции и передать как-то вроде new unsigned char [max_child_size*child_number] не вопрос?И ещё. У меня не компилируется код если явно объявить деструктор базового как delete . В наследнике - можно. Хотя нигде не вызывается ни тот не другой.Это - скользкий вопрос но: И последнее. Если работать напрямую с памятью, то методы вызываются как виртуальные даже без наследования. Правда, пропадает связь с базовым классом напрочь. То есть, если последнее не нужно, то и наследование вроде как излишне. В этом разе достаточно совпадения сигнатур для вызова через указатель на "базовый" (класс публикующий интерфейс). Но смешивать наследников и не наследников уже нельзя будет. Тут я сомневаюсь и с удовольствием послушаю мнения.
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
07.08.2019, 16:43 [ТС] | 9 |
Да, неплохое промежуточное решение.
Просто код получается более читаемым чем километровый std::max для вычисления размера пула. Ну это понятно что если знать точный тип наследника, его методы можно дергать и без virtual. Причем, безотносительно к прямой работе с памятью. Более старому по барабану, новый gcc уже ругается. И case без break он тоже, оказывается, не очень любит, хочет новомодный [[fallthrough]].
0
|
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
07.08.2019, 16:46 | 10 |
Ты не забывай, что хоть у твоих классов и нет деструкторов, конструкторы у них могут быть любые. В этом случае с union возникнет проблема.
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
07.08.2019, 16:51 [ТС] | 11 |
Вот для этого у union и прописан пустой конструктор. Если у union есть конструктор, элементам union также можно иметь конструктор. Типа, union разберется что и как конструировать.
0
|
07.08.2019, 16:59 | 12 | |||||
3
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
||||||
07.08.2019, 17:03 [ТС] | 13 | |||||
Да, через вспомогательный шаблон действительно красивее. Только, наверно, не через структуру, а через функцию.
0
|
07.08.2019, 17:09 | 14 | |||||
Можно и без структуры и без функции:
2
|
Комп_Оратор)
|
|
07.08.2019, 17:52 | 15 |
Это я преобразовании указателя на участок не типизированный по способу выделения. То есть, тот случай что вы описали, но без union.
Добавлено через 6 минут Как раз не важно. Важно иметь именованный метод с той же сигнатурой и он вызовется (или буде бум, если объявлено не в той же последовательности ).
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
07.08.2019, 18:03 [ТС] | 16 |
Каким чудом при использовании parent->method вызовется метод с той же сигнатурой, но из Child? У нас же по условию задачи нет таблицы виртуальных функций. Соответственно, коду неоткуда узнать какую из возможных перегрузок дергать. Или имеется ввиду ручная реализация выбора перегрузки через switch(typeID)?
0
|
Комп_Оратор)
|
||||||
07.08.2019, 19:44 | 17 | |||||
Обычным. Имена совпадают, сигнатуры и порядок объявления, общее количество (может быть тоже нужно) одинаково. Тогда через указатель любого близнеца (разнояйцевого - пардон за н6атурализм) можно вызвать соответствующий метод любого другого.
Добавлено через 3 минуты
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
07.08.2019, 19:49 [ТС] | 18 |
Имена совпадают, а тела функций в FirstChild и SecondChild абсолютно разные. И никакой информации о том, какое тело подразумевалось, нет. Или все же имеется ввиду вызов с явным указанием подразумеваемого потомка?
Добавлено через 4 минуты Закоментировал virtual. Чуда не случилось, оба раза вызвался базовый метод.
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
07.08.2019, 19:50 [ТС] | 20 |
0
|
07.08.2019, 19:50 | |
07.08.2019, 19:50 | |
Помогаю со студенческими работами здесь
20
Виртуальные методы Виртуальные методы виртуальные методы Наследование и виртуальные методы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |