|
virtual methods
|
|||
---|---|---|---|
#18+
Уважаемые коллеги объясните плиз Код: 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. 36. 37. 38. 39. 40.
Почему - нет ругани на override без ключевого слова virtual ? - почему даже не будучи virtual o->m(); все равно дергает метод класса С Я все время думал что если метод невирутальный то A o дернет метод на классе А. Поясните плиз тогда зачем вообще оверрайдить метод и снова делать его виртуальным - если вызов и так будет корректным. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2018, 23:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semen, давай по порядку появления в языке. 1. Сначала было только ключевое слово virtual, которое было обязательлно в базовом классе. Если сигнатура вызова в производном классе совпадала с сигнатурой виртуального метода в базовом классе, то метод был полиморфный. Но для упрощения в производном классе также можно было использовать ключевое слово virtual, чтобы легче читать код (сразу видно, что это общий интерфейс). Но тут существовала проблема: для удобства сделав в производном классе метод virtual и отнаследовавшись от этого производного класса, получали еще один полиморфизм, что не всегда нужно (в твоем случае от В к С). 2. Поэтому в С++11 это "расшили": появилось необязательное (?) ключевое слово override: теперь оно показывает общий интерфейс с базовым классом, а слово virtual- возможность иметь общий интерфейс с производным классом. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2018, 23:19 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semen, потому что оверрайд имеет приоритет над виртуализацией ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2018, 23:22 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Потому что virtual необязателен в наследнике. Если метод объявлен virtual в предке то он в наследнике тоже virtual. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 00:16 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenЯ все время думал что если метод невирутальный то A o дернет метод на классе А. У тебя метод m - виртуальный. Каким местом ты думал иначе - непонятно. http://en.cppreference.com/w/cpp/language/override Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 00:23 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Так как А объявлен с виртуальным методом, все его потомки будут иметь таблицу виртуальных функций, и там будет m(){}. Dimitry SibiryakovУ тебя метод m - виртуальный. Каким местом ты думал иначе - непонятно.Класса В у него содержит тот самый метод, но не виртуальный, может поэтому и думал? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 05:20 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Siemarglsemen.s.semen, потому что оверрайд имеет приоритет над виртуализацией Это вообще о чём??? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 07:05 |
|
virtual methods
|
|||
---|---|---|---|
#18+
NekZSiemarglsemen.s.semen, потому что оверрайд имеет приоритет над виртуализацией Это вообще о чём???Неверно выразился - если оверрайд, то обязательно и виртуальный тоже. Ссылка на стандарт на 2 поста выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 09:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
SiemarglНеверно выразился - если оверрайд, то обязательно и виртуальный тоже. Ссылка на стандарт на 2 поста выше. Если удалить из программы все override то суть программы не изменится. Это просто такой static_assert для виртуальных функций. А так все правильно ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 10:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semen, в общем-то, тебе здесь всё, более-менее, расписали, но я рекомендую тебе рассмотреть свой пример с точки зрения ABI: 1. Компилятор создает три таблицы виртуальных методов для классов A, B и C; 2. В vtable класса A у тебя указатель на "void m()" и указатель на деструктор ~A(); 3. В vtable класса B у тебя переопределённый для класса B указатель на "void m()", указатель на ~A() и указатель на ~B(); 4. В vtable класса C у тебя переопределённый для класса C указатель на "void m()", указатель на ~A(), указатель на ~B() и указатель на ~C(); 5. Создавая экземпляр класса C, первым элементом экземпляра класса, доступным по возвращаемому оператором new указателю, является указатель на таблицу виртуальных методов класса C и никакое стандартное приведение типов его не изменит. Изменить поведение виртуальных функций экземпляра класса можно ( это грязный хак ) только изменив указатель на таблицу виртуальных методов другого класса, например на указатель к VTABLE класса A, но, во-первых, для этого необходимо иметь экземпляр класса A в качестве источника, а во-вторых, при попытке разрушить такой объект, не отработают деструкторы ~C() и ~B(), которые должны освободить ресурсы, захваченные конструкторами при создании экземпляра класса C (в твоём вырожденном примере, конструкторы классов никакие ресурсы, типа памяти из кучи, не захватывают); Это тебе для баловства (сделай trace в отладчике): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 11:04 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Кстати а если у класса A виртуальный деструктор - то что будет если у B,С будут невиртуальные деструкторы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 11:15 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenКстати а если у класса A виртуальный деструктор - то что будет если у B,С будут невиртуальные деструкторы ?Тебе надо будет дёрнуть деструктор ~B вручную из ~C. Что мешает попробовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 11:17 |
|
virtual methods
|
|||
---|---|---|---|
#18+
[offtop] Ну что, форумяне, теперь вы согласитесь со мной, что для лучшего понимания - как всё работает, изучение программирования лучше начинать с ассемблера и ABI ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:01 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenКстати а если у класса A виртуальный деструктор - то что будет если у B,С будут невиртуальные деструкторы ? Если в предке виртуальный, то неважно уже что там в наследниках - они уже по-любому виртуальные. rdb_devТебе надо будет дёрнуть деструктор ~B вручную из ~C. Что мешает попробовать? Не надо. rdb_devНу что, форумяне, теперь вы согласитесь со мной, что для лучшего понимания - как всё работает, изучение программирования лучше начинать с ассемблера и ABI ? Это не всем помогает, как видно ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:20 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:27 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devТебе надо будет дёрнуть деструктор ~B вручную из ~C. Не надо. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:33 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Деструкторы родителя дергаются автоматически Это я вчера еще прочитал ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:37 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenДеструкторы родителя дергаются автоматически Это если ты уничтожаешь потомка по ссылке на потомка. При уничтожении потомка по ссылке на родителя есть варианты. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:39 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovsemen.s.semenДеструкторы родителя дергаются автоматически Это если ты уничтожаешь потомка по ссылке на потомка. При уничтожении потомка по ссылке на родителя есть варианты. Расскажите поподробнее плиз ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:40 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovЭто если ты уничтожаешь потомка по ссылке на потомка. При уничтожении потомка по ссылке на родителя есть варианты. Если деструктор предка виртуальный то все работает как надо, неважно как удалять. А виртуальный деструктор предка вообще-то нужно делать всегда если есть виртуальные функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 12:47 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyЕсли в предке виртуальный, то неважно уже что там в наследниках - они уже по-любому виртуальные. rdb_devТебе надо будет дёрнуть деструктор ~B вручную из ~C. Что мешает попробовать?Не надо.Ну, забыл я про этот нюанс! Даже не обратил внимания на подсказки IDE NetBeans - значки переопределения на полях. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:03 |
|
virtual methods
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyА виртуальный деструктор предка вообще-то нужно делать всегда если есть виртуальные функции. Да. Но не все это помнят и не все версии компиляторов об этом предупреждают. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
semen.s.semenА понтов то понтов Где ты увидел, что я понтуюсь? :) Неужели тебе был бесполезен мой пример с указателями на таблицы виртуальных методов? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:08 |
|
virtual methods
|
|||
---|---|---|---|
#18+
rdb_devsemen.s.semenА понтов то понтов Где ты увидел, что я понтуюсь? :) Неужели тебе был бесполезен мой пример с указателями на таблицы виртуальных методов? Ну ты отправил меня чего то там проверять вместо того чтобы корректно разобраться Это я называю понтами Я и так вчера запускал код и видел как работают деструкторы Интересно было пообщаться с экспертами ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2018, 13:12 |
|
|
start [/forum/topic.php?fid=57&msg=39647904&tid=2017692]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 256ms |
total: | 382ms |
0 / 0 |