Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskySashaMercury, 1) Когда я вижу a.xxx или a->xxx то я ожидаю, что вызовется xxx именно у того класса, на экземпляр которого указывает a (или сам им является). В С++ это так и есть для полей и виртуальных функций. А для обычных функций класса - нет, даже если наследник переопределил функцию. 2) виртуальные функции - это в сочетании с наследованием в С++ необходимый и достаточный инструмент для реализации концепции интерфейсов. Так что что почти в любой программе в которой больше одного модуля они используются. Да, я с вами согласен, но мне было интересно другое. Если бы вы в 1982 участвовали в разработке С++, и пусть на том этапе вы также бы отказались от RTTI (пусть позже она и будет добавлена) и пришли к статическому контролю типов и виртуальным функциям(одно собственно вытекает из другого), то какой на тот момент была бы логичной с вашей точки зрения обработка ситуации кода ниже? Код: 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. Окей, пусть строчка 1 будет корректной, в a.x будет передан b.x. Но из каких соображений было принято решение о сокрытии copy базового класса в классе B мне не очень понятно. Произошло бы частичное изменение состояния b и что в этом страшного? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 00:44 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Т.е. мне понятно, что a может указывать на объект класса B, и тогда будет неоднозначность при вызове b.copy(&a) - какой именно copy B использовать, но с другой стороны, неужели сокрытие было единственным выходом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 00:49 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
maytonSashaMercury, у меня нет ненависти к ООП. У меня есть бесконечное изумление. ООП - это всего лишь технический приём. Фича. Коих в современном ЯП более сотни. Но мы с упорством почитателей карго-культа из раза в раз поднимем один и тот-же топик. Неужели нельзя почитать спеку? Сдедать макет. Runn-ить 1 раз и сделать вывод. Дада. Я плюсую даже за последний кейс. И я-бы так поступил. И это правильно. Программирование это инженерное исскусство. Ребята! Инженеры! Коллеги. Неужели у вас нет других тем? Откройте новости науки и техники. Миссия на Марс. Исследование снимков космоса. Новые открытия в области ракетных двигателей. Интернет вещей. Диагностика сердечных заболеваний по сведениям от пульсомеров. Современная математика. Проблемы Гильберта которые не решены. Языки программирования. Мартин Одерский создает salable language который вобрал в себя все парадигмы всех языков. Новые модели мультизадачности. Акторы. Которые мы обсуждаем в смежном топике. Квантовые вычисления. Нейронные сети. Машииное зрение. Роевый интеллект. Здесь есть релевантные к С++ темы! Да есть! Есть библиотеки. Фреймворки. Есть юзкейсы. Но неужели чорт вас возьми, господа мы 30 лет будем обсуждать этот технический приём с двумя классами!? Это знаете-ли как в университете на курсе матана внезапно обратиться к профессуре с вопросом о решении квадратных уравнений. Это пошло. И стыдно. Пошло и стыдно изменять тому человеку, которого любишь, а в том чтобы задавать вопросы или даже, например, работать проституткой нет ничего такого пошлого или стыдного. У вас есть возможность в любой момент закрыть любой топик в Сообществе CPP, потому мне не понятно почему вы выносите это на публичное обсуждение. maytonЧто за топик? Если мы его закрыли то видимо на то были основания. Подними ее снова но в нужном подфоруме и с нужной фомулировкой. Подчеркнутое я считаю как-бы брошенным упреком. Дескыть здесь (в sql.ru) что-то неправильно модерируют и кого-то избирательно обижают. Он был удален даже, это было поздравительная новогодняя задача Сообществу на 2016 год)) Брошенный упрек был в конце 2016, а не сейчас))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 00:56 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Пошлость означает в данном контексте - прошлое. Прошедшее. Обыденное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 01:06 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercuryпусть на том этапе вы также бы отказались от RTTI (пусть позже она и будет добавлена) и пришли к статическому контролю типов и виртуальным функциям Без RTTI нельзя реализовать виртуальные функции. SashaMercuryНо из каких соображений было принято решение о сокрытии copy базового класса в классе B мне не очень понятно. Во-первых это не имеет отношение к вирт. функциям. Эта фича про перегрузку любых наследованных функций. Почему ее сделали - без понятия. Наверно чтобы потомок мог перехватывать перегрузки предка одной обобщенной функцией. А если ему это не надо то он может подключить перегрузки предка через using. Т.е. программиста не поставили перед фактом, а дали выбор. Уже неплохо по сравнению с разными диктаторскими языками )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 13:44 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Anatoly MoskovskyБез RTTI нельзя реализовать виртуальные функции. Не очень понимаю, BS напротив разделяет эти понятия. RTTI был добавлен только в 1991-1992 году совместно с Лисенковым ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 17:12 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercury Лисенковым Ленковым ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 17:14 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercuryRTTI был добавлен только Возможно позже был добавлен интерфейс к RTTI через dynamic_cast и typeid. Но сам RTTI как механизм различения классов в рантайме существовал, иначе в рантайме никак не определить какого класса функцию надо вызвать для данного указателя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 18:49 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskySashaMercuryRTTI был добавлен только Возможно позже был добавлен интерфейс к RTTI через dynamic_cast и typeid. Но сам RTTI как механизм различения классов в рантайме существовал, иначе в рантайме никак не определить какого класса функцию надо вызвать для данного указателя. Безусловно такой механизм существовал, но я имел ввиду то, что при разработке виртуальных функций в С++, стоял вопрос о не предоставлении программисту api в виде, например, dynamic_cast, typeid, type_info, и было принято решение отказаться от добавления такого вида интерфейса в силу того, что вместо грамотного(как полагал BS) проектирования и декомпозиции классов, программисты писали бы код подобный такому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 19:51 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskySashaMercuryRTTI был добавлен только Возможно позже был добавлен интерфейс к RTTI через dynamic_cast и typeid. Но сам RTTI как механизм различения классов в рантайме существовал, иначе в рантайме никак не определить какого класса функцию надо вызвать для данного указателя. Для реализации мех-ма виртуальных функций достаточно таблицы указателей на них. RTTI это немного более широкий механизм, который уже может определять например, наследование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 22:43 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SiemarglДля реализации мех-ма виртуальных функций достаточно таблицы указателей на них. Указатель vtable это и есть весь RTTI который существует в С++ на данный момент. SiemarglRTTI это немного более широкий механизм, который уже может определять например, наследование. Может в каком-то другом языке, но не в С++ )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 00:09 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Не согласен 1. type_info не хранится в VMT 2. для downcast и cross-cast, информации VMT недостаточно (это я и имел в ввиду про определение наследования) Сейчас я уже не полезу в потроха, но на первый взгляд должно быть так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 01:26 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Любопытство замучило. Значит так, для GCC Код: 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. 41. 42. 43. 44. 45. 46. dynamic_cast это по факту вызов функции с 4мя параметрами - указатель на объект, два указателя на typeinfo и 0 (может для каких-то случаев) Так что RTTI > VMT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 01:43 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
maytonSashaMercury, у меня нет ненависти к ООП. У меня есть бесконечное изумление. ООП - это всего лишь технический приём. Фича. ... Ребята! Инженеры! Коллеги. Неужели у вас нет других тем? Откройте новости науки и техники. Миссия на Марс. Исследование снимков космоса. Новые открытия ... Здесь есть релевантные к С++ темы! Да есть! Есть библиотеки. Фреймворки. Есть юзкейсы. Но неужели чорт вас возьми, господа мы 30 лет будем обсуждать этот технический приём с двумя классами!? ... Да, Марк абсолютно прав. Неправ только в одном -- обсуждать-то можно, если есть непонимание чего-то или незнание. Но философски рассуждать на эту тему -- да, особого смысла нет. Кстати, я за последние полгода сделал один расчётный сервис, так что удивительно, сам он написан практически вообще без ООП, там есть 4 класса, созданные искусственно и абсолютно произвольно, и используемые скорее для организации кода, чем для решения каких-то задач. Всё остальное -- просто функции, лямбды и вэльютайпы. Сервис был списан с аналогичного другого сервиса на питоне. Очень хорошо получилось -- ну не нужно там ООП! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 10:50 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercurymasterziv, во времена появления С++, наверное, разработчики боялись всего-всего, и я полагаю, что Страустрап просто остерёгся делать все поголовно функции виртуальными. Не знаю как я сразу не прочитал. BS действительно упоминает о том, насколько настороженно общественность отнеслась к виртуальным функциям. Спасибо! Ну я этого не знал, это была просто догадка. С другой стороны, я же тоже ТОГДА программировал, тоже всего боялся :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 10:52 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercuryAnatoly Moskovsky, Anatoly MoskovskyБез RTTI нельзя реализовать виртуальные функции. Не очень понимаю, BS напротив разделяет эти понятия. RTTI был добавлен только в 1991-1992 году совместно с Лисенковым Как бы да, но он видимо разделяет именно RTTI как фичу, а не как идею, она действительно появилась позже, хотя многие фреймворки (MFC, QT) уже делали давно свой RTTI на базе -- не поверишь -- ВИРТУАЛЬНЫХ ФУНКЦИЙ! По сути-то и RTTI, и виртуальные методы -- это динамический полиморфизм в рантайм. Так что Анатолий прав, и я тоже был удивлён твоим постом. В С++ есть статический полиморфизм, и динамический. RTTI, виртуалные методы -- проявление динамического. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 11:00 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SiemarglТак что RTTI > VMT Нет. В т.н. RTTI не содержится ничего стандартного. Даже формат имени которое возвращается никто не гарантирует Если посмотреть на интерфейс type_info то все его поля и методы можно реализовать на основе компайлтайм информации. Реализация может например в качестве имени применить HEX значение указателя vtable, и никакой реальной структуры хранить не надо. Так что type_info это так, компайл-тайм затычка. Да не все объекты хранят этот самый type_info. Когда мы вызываем typeid() для объекта, то только объект с виртуальными функциями умеет в рантайме извлекать type_info, а остальные это делают в компайлтайме. Что как бы немного противоречит первым двум буквам RTTI )) А вот vtable для объекта известен только в рантайме - он и есть настоящий RTTI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 11:35 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Ты опустил вторую часть - про dynamic_cast, поскольку надо разобраться по таблицам (по vtable'м, да), кто чей отец, Люк. И только она остается неразрешаемой на этапе компиляции, вот она и есть RTTI. Кстати, это очень дорогая операция - на стековерфлоу были тесты, показывающие что dynamic_cast в 20 раз медленнее, чем сравнение typeinfo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 15:30 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Чуть соврал - typeid(obj) тоже выполняет поиск по таблицам в рантайме, если obj имеет виртуальные ф-ции. Так что тоже run-time функция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 15:38 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SiemarglТы опустил вторую часть - про dynamic_cast, поскольку надо разобраться по таблицам (по vtable'м, да), кто чей отец, Люк. И только она остается неразрешаемой на этапе компиляции, вот она и есть RTTI. Да не надо ничего такого для работы dynamic_cast (компилятор, зная тип может без всякого рантайма увидеть кто предки и как привести от предка к наследнику - нужен только vtable и выводимый из него тип). Но в то что какой-то компилятор с дуру делает какие-то множественные лукапы - верю )) Но к RTTI это не имеет отношения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 20:48 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
по указателю - в compile-time обычно не может ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 21:36 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Siemarglпо указателю - в compile-time обычно не может Осталось привести пример того, что именно не может )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2017, 23:27 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Элементарно Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 00:58 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Siemarglпо указателю - в compile-time обычно не можета я пытался сделать динамическую типизацию на момент компиляции, как бы странно это ни звучало 20256178 и у меня есть идеи для улучшения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 05:20 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39418538&tid=2018245]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 179ms |

| 0 / 0 |
