|
virtual methods
|
|||
---|---|---|---|
#18+
egorychага, на каждой версии компилятора, используемого в разработке в текущий момент, искать отличия от предыдущих версий, медитировать над ними... ведь работа не х.., стояла и будет стоять)))ну когда-то же учиться надо. Это не 100 лет назад, когда один раз в 16 лет научился быть плотником, и потом 100 лет ничего не меняется. Тут совсем другая кухня, надо мыслить стратегически День потерял (на изучение новых плюсов) зато потом за 5 минут долетел. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 05:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbДень потерял (на изучение новых плюсов) зато потом за 5 минут долетел.для этого стандарт надо читать, или страуструпа, а не в ассемблер лазить. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 12:30 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devBarloneпропущено... Сначала вызывается деструктор потомка, и в нем вызывается виртуальный метод потомка. Затем вызывается деструктор предка, потомок уже разрушен, и тут вызывается метод предка.Поверь мне на слово, CEMb совершенно верно написал, что никакого разрушения реально не происходит - после вызова деструктора потомка, память под экземпляром класса не освобождается и деструктор предка абсолютно нормально отработает. Иными словами, объект вполне живой до тех пор, пока не отработают все деструкторы и память не будет освобождена. Задача деструктора - освободить захваченные конструктором ресурсы, но не надо освобождать деструктором конкретного класса то, что не захватывал его конструктор или методы, т.е., если конструктор или методы предка захватили память из кучи и в деструкторе предка есть реализация освобождения этих ресурсов, деструктор потомка не должен эти ресурсы освобождать, хотя и может, если соответствующие члены класса доступны ему через protected или friendly. Да, всё так, только "объект вполне живой" -- не совсем верное определение. Точнее, совсем неверное. У объекта в процессе разрушения меняется тип, он их последнего наследника становится сначала предпоследним, потом пред-предпоследним наследником, и так далее, ... потом -- вторым предком, потом --первым предком, потом только разрушается. Т.е. объект "умирает" частями, от наследников к родителям. В обратном порядке к такому же "рождению" по частям от родителей к наследникам. Т.е. "объект вполне живой" -- неверно , определённые подобъекты всего объекта ещё живы, но какие-то подобъекты уже умерли. Для тех, где отработал деструктор уже -- они мертвы, где ещё нет -- являются валидными объектами. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 13:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devAnatoly MoskovskyВангую что сейчас прозвучит слово борланд ))Не прозвучит, потому что я не помню где наблюдал служебные виртуальные конструкторы. Вполне возможно, что и у Борланда. Ага, Борланд и Виртуальные Констукторы! ЕЕЕЕ! У Борланд даже виртуальные статические методы могут быть и даже виртуальные глобальные фукнции! Я верю всему! ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 13:26 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivrdb_devпропущено... Не прозвучит, потому что я не помню где наблюдал служебные виртуальные конструкторы. Вполне возможно, что и у Борланда. Ага, Борланд и Виртуальные Констукторы! ЕЕЕЕ! У Борланд даже виртуальные статические методы могут быть и даже виртуальные глобальные фукнции! Я верю всему! И они для совместимости с раскладкой дельфийских виртуальных конструкторов объявляемых в registered class. По имени класса в виде строки получаешь описатель класса (указатель на специальный объект) с виртуальными функциями, среди которых функция конструирования экземпляра объекта. Она в классе класса (в С++ прямого аналога нет) виртуальная, но для экземпляра - конструктор. Да, и static virtual есть)))) И оно реально есть и работает ))) Для взятия указателя на функцию которая static virtual берется таблица на указатели не от объекта, а от класса класса (то что в дельфи class of). Берем по имени класса описатель, а у него - да, виртуальная функция и она применяется не к экземпляру класса, а к текущему классу, будучи объявленной в базовом классе )))). Если я чего-то не знаю - это не значит что этого нет. Это значит что я этого не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 14:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivДа, всё так, только "объект вполне живой" -- не совсем верное определение. Точнее, совсем неверное. У объекта в процессе разрушения меняется тип, он их последнего наследника становится сначала предпоследним, потом пред-предпоследним наследником, и так далее, ... потом -- вторым предком, потом --первым предком, потом только разрушается. Т.е. объект "умирает" частями, от наследников к родителям. В обратном порядке к такому же "рождению" по частям от родителей к наследникам. Т.е. "объект вполне живой" -- неверно , определённые подобъекты всего объекта ещё живы, но какие-то подобъекты уже умерли. Для тех, где отработал деструктор уже -- они мертвы, где ещё нет -- являются валидными объектами.Так-то оно так, но пока память из под объекта не перевыделена и не перезатёрта, этот "зомби" может казаться вполне живым и даже корректно помахивать невиртуальными членами. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 16:12 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devТак-то оно так, но пока память из под объекта не перевыделена и не перезатёрта, этот "зомби" может казаться вполне живым и даже корректно помахивать невиртуальными членами. :)только вызвать их при разрушении ( без грязных хаков ) нельзя ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 18:24 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorych, да ну какие грязные хаки при вызове невиртуальных методов? Просто дёрнуть метод по указателю и всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2018, 19:53 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorychCEMbДень потерял (на изучение новых плюсов) зато потом за 5 минут долетел.для этого стандарт надо читать, или страуструпа, а не в ассемблер лазить.Знания без понимания принципов и механик ведут на тёмную сторону -_- Когда ты что-то просто знаешь - ты можешь забыть, или перепутать что-то. Когда ты понимаешь принципы действия, ты можешь получить правильные знания в любой момент сам. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 05:16 |
|
virtual methods
|
|||
---|---|---|---|
#18+
MasterZivДа, всё так, только "объект вполне живой" -- не совсем верное определение. Точнее, совсем неверное.я просто хотел сказать, что в деструкторе надо действовать аккуратно: если (зачем-то) нужно, то обращаться только к тем данным, которые ещё не разрушены. Кстати, такая же, примерно, ситуация с объектами после std::move - формально их трогать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 05:20 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbКстати, такая же, примерно, ситуация с объектами после std::move - формально их трогать нельзя.Зачем ты придумываешь всякую ерунду? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 05:29 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devegorych, да ну какие грязные хаки при вызове невиртуальных методов? Просто дёрнуть метод по указателю и всё.указатель указывает на тип, в котором нет этих методов, помним об этом? мы в деструкторе предка сейчас. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 12:57 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbКогда ты понимаешь принципы действия, ты можешь получить правильные знания в любой момент сам.принцип действия конструкций языка описан в стандарте, знание конкретной реализации не добавляет ничего нового, кроме ложной уверенности в обладании неким сакральным секретом. Вон, в соседнем топике рубятся уже 3 страницы о смысле инструкции push rax, чем это им помогает в понимании С++ я не знаю)) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:06 |
|
virtual methods
|
|||
---|---|---|---|
#18+
CEMbКстати, такая же, примерно, ситуация с объектами после std::move - формально их трогать нельзя. std::move ничего не делает с объектами. А вот move-ctor или move-assignment-operator - да, делают. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorych, невиртуальные методы есть всегда. Рассмотри такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:28 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorychВон, в соседнем топике рубятся уже 3 страницы о смысле инструкции push rax, чем это им помогает в понимании С++ я не знаю))Где ты в 4-х комментариях три страницы разглядел? Про назначение push rax в примере уже давно выяснили. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:31 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devegorych, невиртуальные методы есть всегда. Рассмотри такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6.
что будет, если я так напишу, подумай: Код: plaintext 1. 2.
?? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:46 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devegorychВон, в соседнем топике рубятся уже 3 страницы о смысле инструкции push rax, чем это им помогает в понимании С++ я не знаю))Где ты в 4-х комментариях три страницы разглядел? Про назначение push rax в примере уже давно выяснили.это был сарказм))) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devegorych, невиртуальные методы есть всегда. Рассмотри такой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Ну да, выстрелить себе в ногу можно всегда. Примерно с тем же успехом можно сделать и так: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 13:50 |
|
virtual methods
|
|||
---|---|---|---|
#18+
egorych Код: plaintext 1. 2. 3. 4. 5. 6.
Это не "грязный", а "чистый" хак. Грязный, это когда ты, например, у экземпляра класса сам меняешь указатель на vtable. egorychчто будет, если я так напишу, подумай: Код: plaintext 1. 2.
??Именно так я и тестировал! Всё прекрасно отработает. :) Ведь деструктор отрабатывает до того, как память будет освобождена. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 15:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
BarloneНу да, выстрелить себе в ногу можно всегда. Примерно с тем же успехом можно сделать и так: Код: plaintext 1. 2. 3. 4.
Речь не о суициде, а о том, что по типизированному указателю невиртуальные методы работают при любых обстоятельствах. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 15:10 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devИменно так я и тестировал! Всё прекрасно отработает. :) Жесть ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 15:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Barlone, кстати, твой пример прекрасно будет работать, если вручную выставить указатель на vtable. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 15:36 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Забыл дописать - на x86_32 при выравнивании структур на 4 байта. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2018, 15:49 |
|
|
start [/forum/topic.php?fid=57&msg=39651441&tid=2017692]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 251ms |
total: | 381ms |
0 / 0 |