Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
Недавно наткнулся на такое сообщение в студии. А у меня однажды аська упала с таким же сообщением. И я все думал: как такое может быть. И тут понял. Виртуальная функция переопределенная в наследнике вызвана в деструкторе базового класса. Т.е. когда объект наследник уже уничтожен. Это же, наверное, странно что виртуальные функции не работают в конструкторах, но работают в деструкторах (приводят к падению). В чем причина ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2010, 22:42 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
petravНедавно наткнулся на такое сообщение в студии. А у меня однажды аська упала с таким же сообщением. И я все думал: как такое может быть. И тут понял. Виртуальная функция переопределенная в наследнике вызвана в деструкторе базового класса. Т.е. когда объект наследник уже уничтожен. Это же, наверное, странно что виртуальные функции не работают в конструкторах, но работают в деструкторах (приводят к падению). В чем причина ? Во-первых вызов неабстрактных виртуальных функций работает и в конструкторе и деструкторе (просто работает не так как ожидается интуитивно) Во-вторых, вызов абстрактного метода приводит к падению и в деструкторе и в конструкторе абстрактного класса. Явно вызвать абстрактный метод конечно нормальный компилятор не даст, как минимум такая программа не должна слинковаться. Поэтому если возникает указанная ошибка то значит применили какойто хак типа этого: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 00:13 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
On 26.11.2010 0:13, Anatoly Moskovsky wrote: > Во-первых вызов неабстрактных виртуальных функций *работает *и в конструкторе и > деструкторе (просто работает не так как ожидается интуитивно) Я бы сказал обратное. > Явно вызвать абстрактный метод конечно нормальный компилятор не даст, как > минимум такая программа не должна слинковаться. Это неверно. Он не даст инстанциировать наследника без переопределения этого метода. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 17:20 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
У меня в результате тривиальной ошибки получался такой фокус. Не воспроизведу - не помню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 18:10 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
Кажется вспомнил. Из конструктора и компилятор пропустил ) Если не вру - в конструкторе вызов любой функции невиртуальный, а вот в деструкторе все вызывается правильно (наследника). Тогда petrav ошибается во фразе - "Виртуальная функция переопределенная в наследнике вызвана в деструкторе базового класса. Т.е. когда объект наследник уже уничтожен." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 18:23 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
Siemargl, это делается так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 18:38 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
SiemarglТогда petrav ошибается во фразе - "Виртуальная функция переопределенная в наследнике вызвана в деструкторе базового класса. Т.е. когда объект наследник уже уничтожен." Нет, у меня вызывалась читая виртуальная функция именно в деструкторе базового объекта - базовый класс занимался разрегистрацией в некотором менеджере и ему нужен был Reference Name (строка) объекта. И функция именно эту строку и возвращала. Пришлось перенести значение RefName в базовый класс. На самом деле все логично, я все понял. Хотя компилятор, сабака, как минимум предупреждение мог бы выдать. Или выдал, а я не заметил. Вот интересно что бы было если бы у чистой виртуальной функции в базовом классе было бы тело... =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 19:11 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВо-вторых, вызов абстрактного метода приводит к падению и в деструкторе и в конструкторе абстрактного класса. Явно вызвать абстрактный метод конечно нормальный компилятор не даст, как минимум такая программа не должна слинковаться. Поэтому если возникает указанная ошибка то значит применили какойто хак типа этого: Код: plaintext 1. 2. 3. 4. 5. Но ведь, дал вызвать и без хаков, натюрлих. VS 2010. Вот интересно как это работает... Отрабатывает деструктор наследника, указатель на vtable переключается на базовый класс, работает деструктор базового, вызывается чистая виртуальная функция, а в таблице для базового класса там указатель на стандартную функцию - она выводит сообщение и завершает приложение. Вот уж не знал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 19:20 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
MasterZiv> Явно вызвать абстрактный метод конечно нормальный компилятор не даст, как > минимум такая программа не должна слинковаться. Это неверно. Он не даст инстанциировать наследника без переопределения этого метода. Тут рассматривается другая ситуация - когда в наследнике все правильно переопределено, а вызов происходит в конструкторе/деструкторе предка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 21:34 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyПоэтому если возникает указанная ошибка то значит применили какойто хак типа этого: Код: plaintext 1. 2. 3. 4. 5. Мда... Anatoly Moskovsky ... вы как всегда. Слов нет. Так и было. Я тут задумался над своим описанием своей же ситуации. Подумал что менеджеру то RefName нафиг не нужен. Посмотрел свой же код - базовый класс в деструкторе передает менеджеру свой указатель на разрегистрацию. А уже менеджер зовет чистую виртуальную функцию объекта, возвращающую не RefName, а другую характеристику объекта (числовую). Он по ней разбрасывает объекты по массивам. Вы правы, как всегда. Ну или почти всегда. =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 22:08 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
SiemarglЕсли не вру - в конструкторе вызов любой функции невиртуальный, а вот в деструкторе все вызывается правильно (наследника). Согласно стандарту 2003: 10.4.6. Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor (or destructor) is undefined . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2010, 22:46 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
SiemarglУ меня в результате тривиальной ошибки получался такой фокус. Не воспроизведу - не помню. Это либо в конструкторе / деструкторе, либо после срезки объекта до абстрактной базы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2010, 00:11 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
Siemargl Если не вру - в конструкторе вызов любой функции невиртуальный, а вот в деструкторе все вызывается правильно (наследника). Все вызовы виртуальных методов без явной квалификации класса делаются виртуально. (может ещё какие-то есть случаи, но в основном это так). В конструкторе и деструкторе наследника при вызове виртуального метода вызовится реализация из этого наследника. В конструкторе и деструкторе предка (абстрактного или нет) вызовится реализация из этого предка, но не потому, что виртуальная функция перестаёт быть виртуальной или "не работает", а потому, что в этот момент объект ещё (в случае констуктора) или уже (в случае деструктора) НЕ ЯВЛЯЕТСЯ объектом класса-наследника, а является объектом класса-предка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2010, 00:17 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Согласен, соврал проверка Код: 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. 30. 31. 32. 33. 34. 35. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2010, 00:36 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
MasterZivSiemarglЕсли не вру - в конструкторе вызов любой функции невиртуальный, а вот в деструкторе все вызывается правильно (наследника). Все вызовы виртуальных методов без явной квалификации класса делаются виртуально. (может ещё какие-то есть случаи, но в основном это так). В конструкторе и деструкторе наследника при вызове виртуального метода вызовится реализация из этого наследника. В конструкторе и деструкторе предка (абстрактного или нет) вызовится реализация из этого предка, но не потому, что виртуальная функция перестаёт быть виртуальной или "не работает", а потому, что в этот момент объект ещё (в случае констуктора) или уже (в случае деструктора) НЕ ЯВЛЯЕТСЯ объектом класса-наследника, а является объектом класса-предка. Логичное объяснение! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2013, 18:09 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
petravНедавно наткнулся на такое сообщение в студии. А у меня однажды аська упала с таким же сообщением. И я все думал: как такое может быть. И тут понял. Виртуальная функция переопределенная в наследнике вызвана в деструкторе базового класса. Т.е. когда объект наследник уже уничтожен. Это же, наверное, странно что виртуальные функции не работают в конструкторах, но работают в деструкторах (приводят к падению). В чем причина ? Причину ты уже сам написал, все правильно, кроме одного момента — виртуальные методов одинаково работают и в конструкторах, и в деструкторах. А именно — вызывается реализация из того класса, экземпляром которого в данный момент является объект. "проблема" заключается в том, что при конструировании и деструировании класс объекта меняется, сначала соответственно сверху иерархии вниз (от предка к конечному наследнику), а потом наоборот вверх, от наследника к предку. Если тебе это мешает , ты можешь реализовать в базовом классе этот метод, даже если он абстрактный, и падения программы в этом случае нее будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 11:51 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
Блин, какой редиск пнул тему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 11:53 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
MasterZivБлин, какой редиск пнул тему? Ахаха. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 12:43 |
|
||
|
pure virtual function call или как-то так...
|
|||
|---|---|---|---|
|
#18+
Николаев А. Н. Н., хохотун ты когда нагуглил тему, то хоть даты смотри. А то вступишь в переписку с Эйнштейном и Бором, некромант ты наш ненаглядный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 12:54 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=36980155&tid=2020166]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 174ms |

| 0 / 0 |
