Berkus
я так понимаю ты хочешь какой-то легаси код так прозрачно завернуть?
Anton
Berkus
эммм
Anton
Да, лол
Arseny
cyberzx 🇷🇺
Быстрый вопрос.
Если в юнионе у нас волатильная переменная, юнион будет считать волатильным?
🦥Alex Fails
Не
🦥Alex Fails
Только "наблюдаемое поведение" члена данных
Berkus
быстрый вопрос: если стрелять в ногу из мортиры, можно ли считать что все остальное тело оторвало от ноги?
vladislav
есть возможность промахнуться
Mikhail
Всем привет! А в стандарте С++11/14 до сих пор нужно при создании хоть одной виртуальной функции объявлять виртуальный деструктор, или с этим что-то сделали уже?
Berkus
Mikhail
Nik
Berkus
ну и что ты предлагаешь с этим сделать?
Mikhail
ну можно автоматом его добавлять, если есть хоть одна виртуальная функция
Berkus
а если я не хочу вызывать деструктор наследника?
Nik
А есть такие кейсы?
Mikhail
cyberzx 🇷🇺
Mikhail
Mikhail
Arseny
cyberzx 🇷🇺
Причём возможны случаи, когда деструктор не должен быть виртуальным
Nik
Berkus
давай, даже интересно стало
весь функционал в базовом классе, производные переопределяют только одну рабочую функцию, т.к. все ресурсы создаются и удаляются в базовом - в производных классах деструкторы не нужны, уруру
Berkus
Anatoly
виртуальный деструктор нужен, когда предполагается удаление через базу
Berkus
Mikhail
Mikhail
cyberzx 🇷🇺
ещё публичный интерфейс может быть невиртуальным. а поведение объекта полиморфируется через защищённый интерфейс, который таки виртуальный
cyberzx 🇷🇺
Mikhail
Mikhail
Anatoly
а виртуальная функция может просто использоваться из обобщенной реализации
struct processor {
void process() {
before();
doprocess();
after();
}
virtual void before() = 0;
virtual void doprocess() = 0;
virtual void after() = 0;
};
}
Berkus
не надо в общем этого вашего "автоматически виртуальным" - это ДЕоптимизация получается
Anatoly
в данном случае, предполагается, что у тебя будут конкретные наследники
Berkus
Arseny
cyberzx 🇷🇺
Я за то, что бы программисты знали что делают и почему делают. А не тупо следовали догматам
Anatoly
concreteprocess1 p1;
p1.process();
concreteprocess2 p2;
p2.process();
Anatoly
которые не предполагают полиморфного удаления
Berkus
Mikhail
т.е. вирутальным :)
Berkus
где мой пирожок
Anatoly
полиморфное удаление и полиморфное поведение - я же тебе привел пример
Mikhail
Berkus
Mikhail
Ладно кароче, я свой вопрос выяснил, надо поработать теперь :)
cyberzx 🇷🇺
А можно пример?
Есть некий шаблонный класс, который является враппером для синглетона. И у него есть bool inited. Который при инициализации ставится true, а в деструкторе false
Но мы же знаем, что в С++ нельзя использовать объекты после вызова деструктора. Это UB. И компилятор знает. Поэтому любое присваивание мемберов класса в деструкторе он просто выкидывает. Зачем присваивать то, что не будет больше никогда использоваться?
В результате, если у нас есть несколько синглетонов и один зависит от второго, то он может использовать его после удаления, так как флаг inited у него true и в деструкторе не очистился
Anatoly
еще миф ходит, что если в классе нет виртуального деструктора, то от него наследоваться опасно
Arseny
Да ладно. Хорошая идея сделать создавать в таких классах витруальный деструктор по умолчанию и запрещать его явно.
В большинстве случаев его отсутствие это баг.
Но совершенно непонятно как это добавить в c++ сохраняя совместимость
Anatoly
вижу, что это одна гвардия
Anatoly
Anatoly
во всех остальных случаях нафиг не нужен виртуальный деструктор
Anatoly
а то слышал "ты отнаследовался от std::vector? но у него же нет виртуального деструктора"
Arseny
Ну тут можно в holywars идти обсуждать, нужно ли вообще наследование в случаях отличных от интерфейса.
Anatoly
нет, я просто показал, что виртульная функция конкретизирующая поведение и виртуальный деструктор две ортогональные по назначению вещи
Ioann_
Иногда деструктор может быть и pure
Anatoly
гы-гы
Anatoly
но с реализацией, без реализации - pure virtual call
Anatoly
при попытке удалить объект такого класса
Anatoly
поскольку цепочку автоматического вызова деструктора ты прервать не можешь
Ioann_
Ага, важное уточнение :)
Anatoly
ой, все
Anatoly
ты смотришь на публичный интерфейс и видишь, что можно делать, а что нельзя
Anatoly
это не кот в мешке, интерфейс тебе доступен
Aidar
И что я там вижу? Вижу нет деструктора виртуального а мне прилетает указатель