🦥Alex Fails
arisudesu
унаследованные типы могут переопределить методы базового, но только те, которые в базовом виртуальные
Алдар
вот допустим есть класс A, B наследник А
Алдар
я пишу A a = B();
Алдар
так можно делать?
arisudesu
отож.
arisudesu
B это частный тип от А
arisudesu
поэтому в обратную сторону приведение возможно
arisudesu
и оперировать B можно как объектом типа А
arisudesu
в этом суть ООП даже
🚀 Snyp
это муть а не суть)
Алдар
а если мы добавим в B новое поле int?
arisudesu
да хоть десять.
Andrei
только это слайсинг.
Алдар
😃
Andrei
A a= B(); вообще довольно поганая конструкция, но даже если предположить что всё ок.
Алдар
мы вам перезвоним
🚀 Snyp
😂
Andrei
после ; будет вызван деструктор B()
arisudesu
а вот это неочевидно, кстати
Andrei
Здесь будет просто копирование.
Andrei
В любом случае.
Алдар
здесь будет копирование со срезкой
Andrei
а потом деструктор
Andrei
Так что да, здесь все-таки слайсинг есть.
Andrei
Всё правильно сказал.
Алдар
в общем верно работать либо с указателями либо с ссылками
arisudesu
B b = B(); A& a = b;
arisudesu
так?
🦥Alex Fails
Блин, пока из элки вылезал, весь попкорн пропустил
Алдар
да
Алдар
тогда слайсинга нету
Andrei
B b = B(); A& a = b;
B b; достаточно в первой строчке
arisudesu
да, я что-то совсем обжабился
Sergey
Мда
arisudesu
и обзмеился
Sergey
Отправилось через сто лет
Andrei
тогда слайсинга нету
но если захотеть, даже тут его можно спровоцировать.
Sergey
Те полиморфизм кек
Алдар
B* b = new B(); A* a = b; delete a;
Andrei
Здесь всё ок будет.
🦥Alex Fails
Кстати. Тут как раз в чате было обсуждение слайсингв. Но никто не знал, а я подзабыл. Поэтому пока помолчу)
Алдар
если деструктор у A виртуальный
Andrei
Пофиг на деструктор
Алдар
то ресурсы выделенные в B будут корректно освобождены
Andrei
просто ок всё будет.
arisudesu
угу
Алдар
если деструктор не виртуальный, то ресурсы в B могут быть не освобождены
🦥Alex Fails
так и будет, если мы delete a;
🦥Alex Fails
Если там будут выделения памяти
Andrei
воу-воу-воу
Andrei
полегче
Andrei
всего неавсего не будет вызван деструктор B
Andrei
деструкторы его полей БУДУТ вызваны
🦥Alex Fails
Я сегодня плохо излагаю свои мысли
arisudesu
эээээ.
arisudesu
а если у В есть поля.
arisudesu
это же тоже память
🦥Alex Fails
деструкторы его полей БУДУТ вызваны
Но если new было, то хер вам😄
🦥Alex Fails
поэтому smart pointers
Алдар
Можно ли вызывать из конструктора виртуальные функции?
arisudesu
лучше не делать
🦥Alex Fails
Лучше не
Алдар
почему?)
arisudesu
vtable не инициализирована
🦥Alex Fails
Там же втбл в неопределенном состоянии
arisudesu
давайте чонить посложнее майерса
arisudesu
все это было у майерса
🦥Alex Fails
Компиль те честно подставит call offset vtbl[0]
🦥Alex Fails
И - ой
🦥Alex Fails
Алдар
что такое SFINAE?
🦥Alex Fails
Substitution Failure is not an error
🦥Alex Fails
Херь, когда компиль не смог подставить в шаблон
🦥Alex Fails
И я ее не поняль до конца
Andrei
странно.