Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Здравствуйте C: Продолжаю изучать D&E BS и некоторые ранние статьи BS. Книга, как я и говорил ранее, великолепная, другой эпитет подобрать трудно. Объем нюансов возникающих при проектировании и разработке языка огромный, не буду их перечислять - те, для кого этот топик вероятно знакомы с ними, а даже если не знакомы, то лучше BS я все равно не напишу. У меня много вопросов, на мой личный взгляд это интересные, хорошие вопросы. И позже, я планировал сделать какую-то отдельную тему посвященную этой книге, но поскольку график слишком плотный, то я понимаю, что времени на это может просто не хватить, да и такие большие топики не всегда приветствуются, что возможно и правильно. Потому пока не время для "всех вопросов". BS отдает виртуальным функциям центральную роль при программировании на С++ и именно реализация такого рода концепции является одним из главных шагов для рождения С++ из C with Сlasses. Выше нужно сделать акцент на слове "реализация", я намеренно не использовал слово "появление". Данный раздел я решил посвятить виртуальным функциям, уже несколько дней они не дают мне спокойно думать о чем-то другом. Точнее не они, а история их реализации в С++. 1. Пусть у нас была бы возможность повлиять на реализацию языка. Представьте, что вы встретили листинг (D&E, BS) Код: 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, 2, и, самое главное, почему? (вопрос не о том, как сейчас будет происходить обработка данного кода). При этом, было бы интересно узнать о ваших мыслях не в контексте того, что сейчас есть в С++, а в контексте того, что у вас есть C with Сlasses и вы планируете интегрировать к данному языку механизм виртуальных функций. 2. Как часто вы используете виртуальные функции в своих программах и как лично вы относитесь к данному механизму? 3. Считаете ли вы ослабление правил замещения для типа возвращаемого значения и для аргументов правильным решением? Интересно, если бы комитет не принял предложения об этом, каким образом были бы решены возможные проблемы(пример из теории компиляторов, метод clone в базовом и производных классах). Лично мне кажется, что это привело бы к изменениям в системе типов языка, что в конечном счете могло положительно сказаться на ней. Было бы очень интересно узнать ваше мнение по данным вопросам:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 22:40 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercury, 1) Когда я вижу a.xxx или a->xxx то я ожидаю, что вызовется xxx именно у того класса, на экземпляр которого указывает a (или сам им является). В С++ это так и есть для полей и виртуальных функций. А для обычных функций класса - нет, даже если наследник переопределил функцию. 2) виртуальные функции - это в сочетании с наследованием в С++ необходимый и достаточный инструмент для реализации концепции интерфейсов. Так что что почти в любой программе в которой больше одного модуля они используются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 23:00 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercuryКакой результат на ваш взгляд было бы логично ожидать в строчках 1, 2, и, самое главное, почему? Лично я бы ожидал, что ошибка компиляции возникнет ещё раньше, когда идёт переопределение метода с другой сигнатурой. Но кое-кто при разработке языка пожадничал на явное указание overload/override и в результате мы имеем отличное логово для багов. PS: override таки появился в С++11 и лично я его использую повсеместно, где хочу именно перекрыть метод. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 23:10 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Параллельное наследование насколько мне известно не реализовано ещё ни в одном языке к сожалению. Всё ложится на плечи программиста на уровне "я знаю что класс А всё таки класс Б" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 08:41 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
" для рождения С++ из C with Сlasses" 20 лет назад я учился именно такому С++. Большинство фишек из 11,14, 17 версий уводят все дальше от этого базового уровня. Становясь более мощным, язык позволяет все более сложные концепции и приемы, это повышает требования к программистам, уменьшает их число, повышает порог вхождения, но от возможности выстрелить в ногу так и не избавляет полностью. Мне кажется, что современный С++ можно рассматривать как ветку от базового, направленную в сторону расширения возможностей языка. И что есть потребность в языке, который был бы другой веткой от базового С++, в котором меньше было бы всяких возможностей в духе Алексндреску, но который был бы надежнее, но без реализации через виртуальную машину (как Java), с сохранением и производительности и возможностью работы с иерархиями классов. Одной из основных возможностей повышения надежности мне кажется контроль работы экземпляров классов только в своей памяти, иное - только через специальные атрибуты. Чтобы в ран-тайме можно было бы включить такой режим контроля, доступна только своя память (и аргументы функций как пример средства реализации возможностей программы). Мне кажется что такой "более надежный но менее навороченный С++/С_с_классами" лучше подошел бы для всяких десктопных приложений, чем Java или C#, например те же десктопные игровые клиенты. Не уверен, может быть Objective C несет в себе что-то такое, давно не смотрел в ту сторону, да и на Windows с ним проблемы, а больше ничего похожего вообще в голову не приходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 09:11 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
teo609, Держи ,,,,,,,,,,,, googlethis: dlang, golang, nimlang, rust ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 10:59 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky 2) виртуальные функции - это в сочетании с наследованием в С++ необходимый и достаточный инструмент для реализации концепции интерфейсов. Так что что почти в любой программе в которой больше одного модуля они используются. нет, это не так. можно программировать вообще без виртуальных функций, на шаблонном полиморфизме, на современном С++ еще на лямбдах, и чем новее версия языка, тем более он нас к этому стимулирует. Виртуальные функции нужны только когда у вас в программе есть иерархии классов. Кстати, я видел в сети предложение в стандарт для реализации в С++ множественной диспетчеризации в виртуальных методах, вот это была бы бомба! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 11:22 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercury Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Какой результат на ваш взгляд было бы логично ожидать в строчках 1, 2, и, самое главное, почему? (вопрос не о том, как сейчас будет происходить обработка данного кода). При этом, было бы интересно узнать о ваших мыслях не в контексте того, что сейчас есть в С++, а в контексте того, что у вас есть C with Сlasses и вы планируете интегрировать к данному языку механизм виртуальных функций. По классике это должен был бы быть Код: plaintext 1. И как раз в тему о multiple dispatching Дело в том, что семантика присваивания полиморфна по отношению к двум видам объектов: что присваивается чему присваивается Возможны тут 4 случая Тип источникаТип приёмникаСемантика операцииBaseBaseНормальное присваивание объекта класса BaseBaseDerivedНедопустимая операция, так как часть членов класса Derived не будет присвоенаDerivedBaseУсечение Derived до Base, опасная, но допустимая в С++ операция, поскольку часть данных теряетсяDerivedDerivedНормальное присваивание объекта класса Derived Именно поэтому operator= как бы не наследуется и не переопределяется. Поэтому я бы рассматривал этот конкретный пример совершенно отдельно от обсуждения виртуальных функций, которые достаточно просты по своей семантике. автор2. Как часто вы используете виртуальные функции в своих программах и как лично вы относитесь к данному механизму? Ну, как часто, так часто, как надо. Это зависит от задачи. В общем, полиморфизм на типе объекта используется везде, где используются иерархии классов и операции над этими классами. С точки зрения семантики виртуальных функций в С++, она, безусловно, контринтуитивна, потому что естественным для программиста было бы, если бы все методы были автоматом виртуальными. Появление в С++ необходимости явно требовать оформления вызова виртуальной функции как косвенного вызова через таблицу виртуальных методов безусловно связана с необходимостью обеспечить управление быстродействием результирующей программы, получаемой из исходного кода. И хотя в общем стоимость виртуального вызова не так уж и сильно больше стоимости вызова обычного (оба на самом деле достаточно высоки, потому что надо формировать аргументы и переключать стек), во времена появления С++, наверное, разработчики боялись всего-всего, и я полагаю, что Страустрап просто остерёгся делать все поголовно функции виртуальными. В более современных языках, которые являются наследниками С++, -- Java и C# -- виртуальные вызовы делаются автоматически везде. Кстати, не многие помнят, что слово virtual в английском языке означает "действительный", и именно поэтому это слово используется в этом случае. автор3. Считаете ли вы ослабление правил замещения для типа возвращаемого значения и для аргументов правильным решением? Интересно, если бы комитет не принял предложения об этом, каким образом были бы решены возможные проблемы(пример из теории компиляторов, метод clone в базовом и производных классах). Лично мне кажется, что это привело бы к изменениям в системе типов языка, что в конечном счете могло положительно сказаться на ней. Я не очень понял, о чём ты тут ... Я бы думал, что кардинальное решение этой проблемы -- множественная диспетчеризация. Другой вариант решения, очень простой -- это использовать вместо Код: plaintext 1. функцию Код: plaintext 1. Тут семантика меняется, не смотря на то, что в принципе функция делает то же самое, и всё становится сильно легче, потому что полиморфизм идёт только по первому и единственному аргументу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 13:27 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)SashaMercury, Параллельное наследование насколько мне известно не реализовано ещё ни в одном языке к сожалению. Всё ложится на плечи программиста на уровне "я знаю что класс А всё таки класс Б" Скорее всего, ты и имеешь в виду множественную диспетчеризацию, а не "параллельное наследование". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 13:49 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivkealon(Ruslan)SashaMercury, Параллельное наследование насколько мне известно не реализовано ещё ни в одном языке к сожалению. Всё ложится на плечи программиста на уровне "я знаю что класс А всё таки класс Б" Скорее всего, ты и имеешь в виду множественную диспетчеризацию, а не "параллельное наследование". нет, именно то, что SashaMercury заметил в С++ оно не особо критично, так как виртуальнных конструкторов всё равно нема архитектурно проблема появляется, например, так: есть контейнер определённых объектов (можно для усложения к этим объектам добавить ссылку на контейнер) у этого контейнера да и у объектов есть виртуальные методы в потомке этого контейнера нужно: расширить дочерние объекты новой функциональностью довольно часто нужно обращаться к новым методам контейнера из объекта и наоборот, а описания у нас имеют базовые типы - пришли к проблеме постоянно каста kealon(Ruslan)"я знаю что класс А всё таки класс Б" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 22:33 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivнет, это не так. можно программировать вообще без виртуальных функций, на шаблонном полиморфизме, на современном С++ еще на лямбдах, и чем новее версия языка, тем более он нас к этому стимулирует. Ну и гвозди можно микроскопом забивать, но молотком удобнее. А интерфейсы реализовывать удобнее всего с помощью виртуальных функций. MasterZivВиртуальные функции нужны только когда у вас в программе есть иерархии классов. Иерархии (помимо реализации интерфейсов) в правильно спроектированной программе не нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 22:59 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyMasterZivнет, это не так. можно программировать вообще без виртуальных функций, на шаблонном полиморфизме, на современном С++ еще на лямбдах, и чем новее версия языка, тем более он нас к этому стимулирует. Ну и гвозди можно микроскопом забивать, но молотком удобнее. А интерфейсы реализовывать удобнее всего с помощью виртуальных функций. MasterZivВиртуальные функции нужны только когда у вас в программе есть иерархии классов. Иерархии (помимо реализации интерфейсов) в правильно спроектированной программе не нужны. Это заявление эквивалентно тому, что Duck Typing - необходимая и достаточная на все случаи жизни. Не согласен, инкапсуляция данных тоже важна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 23:46 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)MasterZivпропущено... Скорее всего, ты и имеешь в виду множественную диспетчеризацию, а не "параллельное наследование". нет, именно то, что SashaMercury заметил в С++ оно не особо критично, так как виртуальнных конструкторов всё равно нема архитектурно проблема появляется, например, так: есть контейнер определённых объектов (можно для усложения к этим объектам добавить ссылку на контейнер) у этого контейнера да и у объектов есть виртуальные методы в потомке этого контейнера нужно: расширить дочерние объекты новой функциональностью довольно часто нужно обращаться к новым методам контейнера из объекта и наоборот, а описания у нас имеют базовые типы - пришли к проблеме постоянно каста kealon(Ruslan)"я знаю что класс А всё таки класс Б" нафига тебе контейнер с полиморфными методами? ну да, иногда нужно что-то настраивать в алгоритмах, но виртуальные методы - не единственный способ это сделать. C++ - не Ява, тем он и хорош, что можно делать по-разному. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2017, 01:21 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivнафига тебе контейнер с полиморфными методами? ну да, иногда нужно что-то настраивать в алгоритмах, но виртуальные методы - не единственный способ это сделать. C++ - не Ява, тем он и хорош, что можно делать по-разному. да как бы обычные практические задачи, вполне конечно можно обходить с помощью генериков или метапрограммирования но в данном случае это явная недоработка, которая мешает компонентному использованию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2017, 07:48 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)MasterZivнафига тебе контейнер с полиморфными методами? ну да, иногда нужно что-то настраивать в алгоритмах, но виртуальные методы - не единственный способ это сделать. C++ - не Ява, тем он и хорош, что можно делать по-разному. да как бы обычные практические задачи, вполне конечно можно обходить с помощью генериков или метапрограммирования но в данном случае это явная недоработка, которая мешает компонентному использованию и часто ты наследуешься от контейнеров и что-то там переопределяешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2017, 23:08 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
У меня возник еще один вопрос, и он должен был быть раньше того, что я спрашивал выше. 0. Модель размещения производного объекта в памяти на 1982 год (думаю, что и сейчас не сильно изменилась) заключалась в объединении его собственных членов и членов базового класса. Anatoly MoskovskySashaMercury, 1) Когда я вижу a.xxx или a->xxx то я ожидаю, что вызовется xxx именно у того класса, на экземпляр которого указывает a (или сам им является). В С++ это так и есть для полей и виртуальных функций. А для обычных функций класса - нет, даже если наследник переопределил функцию. Вы, судя по всему, говорите об этом Код: 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. Но это скорее агрегация. И если поведение выше кажется логичным, то какое адекватное поведение в 1982 Bjarne мог ожидать от такого? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. И это выглядит так, будто агрегация и наследование перемешаны. Потому, и не только потому, но и в целом, почему BS не сделал все методы виртуальными по умолчанию? Если метод будет переопределен в производном классе, то именно это определение фактически будет использовать для объектов данного класса. В том случае, когда не существует возможность представить реализацию конкретного метода в базовом классе, можно, например, использовать инструкцию аналогичную для чисто виртуальных функций. Если можно, приведите пожалуйста пример, где реализация виртуальных функций в таком формате была бы плохим решением. Наверняка тут есть подводные камни ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2017, 15:43 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
И странно, что абстрактные классы не появились сразу, к выходу Cfront 1.0 в 1985. Ведь BS приводит такой пример в 1982, где очевидно, что они нужны (в качестве базового используется класс Shape, виртуальные методы draw(), rotate()) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2017, 15:53 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercuryпочему BS не сделал все методы виртуальными по умолчанию? Производительность. Вызов виртуального метода это как минимум два лишних обращения к случайному участку памяти. Кэши процессора не резиновые, а тогда их вообще не было. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2017, 16:26 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovSashaMercuryпочему BS не сделал все методы виртуальными по умолчанию? Производительность. Вызов виртуального метода это как минимум два лишних обращения к случайному участку памяти. Кэши процессора не резиновые, а тогда их вообще не было. Почему ДВА и почему к СЛУЧАЙНОМУ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2017, 05:21 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivПочему ДВА В случае вызова виртуальной функции: чтение указателя vtable (RAM) ->чтение адреса функции (RAM)->выполнение маш. команды call Вызов обычной функции: выполнение маш. команды call без чтения RAM (адрес функции - внутри команды) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2017, 05:45 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Указатель vtable лежит с данными объекта. Так что на кэш не повлияет, если объект нетривиальный, т.е. работает со своими мемберсами. Так что лишней можно считать одну операцию. Не стоит также забывать, что оптимизатор может производить невиртуальный вызов виртуальных ф-ций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2017, 09:27 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SiemarglТак что лишней можно считать одну операцию. Считать можно что угодно, но операций там две ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2017, 23:09 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyСчитать можно что угодно, но операций там две ))) "лишняя" - одна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2017, 23:24 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Изопропил"лишняя" - одна Anatoly MoskovskyВ случае вызова виртуальной функции: чтение указателя vtable (RAM) ->чтение адреса функции (RAM)->выполнение маш. команды call Вызов обычной функции: выполнение маш. команды call без чтения RAM (адрес функции - внутри команды) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2017, 23:55 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЛично я бы ожидал, что ошибка компиляции возникнет ещё раньше, когда идёт переопределение метода с другой сигнатурой.по идее, explicit решает эту проблему MasterZivКстати, я видел в сети предложение в стандарт для реализации в С++ множественной диспетчеризации в виртуальных методах, вот это была бы бомба!А можно подробнее описать, что это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 05:40 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMbDimitry SibiryakovЛично я бы ожидал, что ошибка компиляции возникнет ещё раньше, когда идёт переопределение метода с другой сигнатурой.по идее, explicit решает эту проблему MasterZivКстати, я видел в сети предложение в стандарт для реализации в С++ множественной диспетчеризации в виртуальных методах, вот это была бы бомба!А можно подробнее описать, что это? Выбор реализации метода по типу не только первого аргумента метода (this), но и всех остальных тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 07:27 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivи часто ты наследуешься от контейнеров и что-то там переопределяешь? как гуи займёшься так почти стабильно нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 07:27 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)MasterZivи часто ты наследуешься от контейнеров и что-то там переопределяешь? как гуи займёшься так почти стабильно нужно расскажи нам об этом (желательно в отдельном топике) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 08:26 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivВыбор реализации метода по типу не только первого аргумента метода (this), но и всех остальных тоже.Интересная идея. А насколько часто нужен такой функционал? Т.е. когда типы параметров явно отличаются, мы делаем перегрузку функций, то тут всё ок. Остаются случаи, когда типы параметров находятся в иерархии классов. Но тут мы тоже можем явно написать функцию для каждого случая. В любом случае нам придётся писать такую функцию. Поэтому не совсем понятно, какая реализация диспетчеризации планировалась? В случае с this ответственность лежит на классе this, а что будет в случае остальных параметров? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 08:43 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovSashaMercuryпочему BS не сделал все методы виртуальными по умолчанию? Производительность. Вызов виртуального метода это как минимум два лишних обращения к случайному участку памяти. Кэши процессора не резиновые, а тогда их вообще не было. Это единственная причина, или есть что-то ещё? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2017, 22:29 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMbMasterZivВыбор реализации метода по типу не только первого аргумента метода (this), но и всех остальных тоже.Интересная идея. А насколько часто нужен такой функционал? Т.е. когда типы параметров явно отличаются, мы делаем перегрузку функций, то тут всё ок. что значит "часто нужен"? это фундаментальное свойство объектной системы языка программирования. Если оно есть или его нет - это две большие разницы. Остаются случаи, когда типы параметров находятся в иерархии классов. ? Но тут мы тоже можем явно написать функцию для каждого случая. ты не сможешь написать тут функцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2017, 09:06 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivты не сможешь написать тут функцию.тогда я, наверно, не совсем понял суть требуемой доработки. Можно какой-нибудь пример для демонстрации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2017, 11:20 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMbMasterZivты не сможешь написать тут функцию.тогда я, наверно, не совсем понял суть требуемой доработки. Можно какой-нибудь пример для демонстрации? как ни странно, в Википедии есть довольно вменяемая статья на эту тему: https://en.m.wikipedia.org/wiki/Multiple_dispatch?wprov=sfla1 Там описано даже предложение для C++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2017, 07:59 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZiv, как по мне, так слегка сомнительная концепция: один класс принимает решение о выборе метода на основе виртуальной таблицы объекта другого класса. И таки это можно реализовать, вызывая внутри метода класса методы объектов и выполняя нужный функционал там. Будет выглядеть запутанно, да, но реализовать можно. Второй вариант: определение типа параметров перед вызовом метода + перегрузка(там же в вики пример на с++). Ну и всё-таки я не могу придумать, где оно может понадобиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2017, 06:29 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMbНу и всё-таки я не могу придумать, где оно может понадобиться. В динамических языках перегрузку можно реализовать только мультидиспетчем. Нафиг это в С++ - это большой вопрос )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2017, 14:23 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMbMasterZiv, как по мне, так слегка сомнительная концепция: один класс принимает решение о выборе метода на основе виртуальной таблицы объекта другого класса. Кто тебе сказал, что это делает ОДИН КЛАСС ? CEMbИ таки это можно реализовать, вызывая внутри метода класса методы объектов и выполняя нужный функционал там. Будет выглядеть запутанно, да, но реализовать можно. Второй вариант: определение типа параметров перед вызовом метода + перегрузка(там же в вики пример на с++). Ну и всё-таки я не могу придумать, где оно может понадобиться. Там же дан пример о столкновении двух объектов при моделировании... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2017, 18:06 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivКто тебе сказал, что это делает ОДИН КЛАСС ?В коде одного класса.MasterZivТам же дан пример о столкновении двух объектов при моделировании...пример не показательный, так как столкновение нормально делается по-другому(собственно, оно там и так сделано по-другому, но как эмуляция реализации идеи), и там множественная диспетчеризация не требуется. Давайте ещё раз. Простой пример: есть класс X, с методом, принимающим параметр класса А. Класс А является корнем иерархии классов. Идея MD: мы пишем X::m(A a), X::m(B a), X::m(C a),... и внутри пишем реализацию на каждый класс иерархии. При выполнении рантайм понимает, что у нас за объект и вызывает соответствующий метод. Сейчас будет вызван метод X::m(A) всегда. В примерах реализация делается за счёт определения класса через dynamic_cast внутри метода X::m. У меня есть 2 замечания к самой идее: 1. Реализация класса X зависит от иерархии классов A. Это неправильно: в случае добавления класса в иерархию, возможно нужно будет править код в X, добавлять ещё один метод m. К слову сказать, у меня есть работающий код "столкновения" двух объектов, в котором параметры столкновения передаются методу обработки классу самого объекта. Это "один" метод на все типы объектов, т.е. тут стандартная диспетчеризация 2. Класс X принимает решение об обработке в методе m на основе класса входящего параметра. Это допускается, но сомнительно. Ну и, всё ещё не могу придумать пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2017, 05:46 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMb, Так и классы можно писать по-другому, на C, и никакой C++ не нужен... А можно классы на ассемблерная писать, никакой C не нужен... А можно еще данные самому в файл писать, никакая СУБД не нужна... А зачем вообще компьютер, он же дорогой такой... Лучше на счетах считать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2017, 06:19 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMb[ У меня есть 2 замечания к самой идее: 1. Реализация класса X зависит от иерархии классов A. Это неправильно: в случае добавления класса в иерархию, возможно нужно будет править код в X, добавлять ещё один метод m. 2. Класс X принимает решение об обработке в методе m на основе класса входящего параметра. Это допускается, но сомнительно. . еще раз, с чего ты взял, что то, какой метод будет вызван - это реализация класса X, а не языка C++ ? Сейчас ты пишешь виртуальную функцию, реализуешь ее в каком-то классе, затем она вызывается... у тебя же не возникает ощущение того, что какой-то другой класс принимает решение о вызове твоей реализации виртуальной функции? Нет, не возникает. Почему же оно у тебя возникает в случае MD ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2017, 06:27 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyCEMbНу и всё-таки я не могу придумать, где оно может понадобиться. В динамических языках перегрузку можно реализовать только мультидиспетчем. Нафиг это в С++ - это большой вопрос )) вот это - дельное замечание... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2017, 06:29 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivА зачем вообще компьютер, он же дорогой такой... Лучше на счетах считать!Всё упирается в востребованность. Компьютеры востребованы, счёты - нет. И есть куча примеров, где компьютеры справляются лучше, чем счёты. Но всё ещё нету примеров, где MD справляется лучше, чем то, что есть сейчас. Где примеры? MasterZivеще раз, с чего ты взял, что то, какой метод будет вызван - это реализация класса X, а не языка C++ ?да, верно, это реализация С++. Но по первому замечанию я не согласен, т.е. это не в плане реализации MD, а в плане архитектуры приложения: в случае изменения иерархии классов А, нам (вероятно) надо менять код класса X. Когда мы работаем с объектами иерархии А через интерфейс, нам менять X не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 06:27 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZiv еще раз, с чего ты взял, что то, какой метод будет вызван - это реализация класса X, а не языка C++ ? Немного почитал статью про open multimethods. Основная идея в том, что мультиметодом можно сделать только свободную функцию, не функцию класса. При этом все параметры, по которым будет идти диспетчеризация, помечаются ключевым словом virtual. Поэтому все твои опасения напасны, это не будет реализацией какого-то класса. Также там есть в самом начале примеры того, где OMM могла бы быть полезной, приводится пример системы кодирования изображения с подсистемой перекодирования изображения из одного формата в другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 08:02 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivНемного почитал статью про open multimethods.там, оказывается, всё сложнее, чем я себе представлял.MasterZivПоэтому все твои опасения напасны, это не будет реализацией какого-то класса.да я не опасался, я просто думал, что если делать через метод, то архитектура будет не шибко иделальнойMasterZivТакже там есть в самом начале примеры того, где OMM могла бы быть полезной, приводится пример системы кодирования изображения с подсистемой перекодирования изображения из одного формата в другой.о, так под это подходят любые конверторы из чего-то во что-то. А так же какие-нибудь агрегаторы. Ну всё, можно делать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 09:04 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMb, ... а также любой оператор присваивания... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 12:17 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZiv, а так же любой бинарный оператор... ёпрст... как мы сейчас выживаем вообще без MD!?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 12:46 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMbMasterZiv, а так же любой бинарный оператор... ёпрст... как мы сейчас выживаем вообще без MD!?! вот. а между тем, это всего лишь рассказ про ту козу, для избавления от которой ее надо сначала завести. Завели себе козу статической типизации с выдумыванием обрядов моления на нее, а теперь вопрос - как избавиться от той козы не методом ее продажи или съедения, а путем делания вида, что ее нет. Достаточно ли не замечать козу, чтобы несовместимая с ней множественная диспетчеризация сама по себе появилась, и тоже ту козу не заметила? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 13:43 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
teo609" для рождения С++ из C with Сlasses" 20 лет назад я учился именно такому С++. Большинство фишек из 11,14, 17 версий уводят все дальше от этого базового уровня. Становясь более мощным, язык позволяет все более сложные концепции и приемы, это повышает требования к программистам, уменьшает их число, повышает порог вхождения, но от возможности выстрелить в ногу так и не избавляет полностью. Мне кажется, что современный С++ можно рассматривать как ветку от базового, направленную в сторону расширения возможностей языка. И что есть потребность в языке, который был бы другой веткой от базового С++, в котором меньше было бы всяких возможностей в духе Алексндреску, но который был бы надежнее, но без реализации через виртуальную машину (как Java), с сохранением и производительности и возможностью работы с иерархиями классов. Просто ООП себя исчерпало. В нём ковырялись 30 лет как в грязном пальце на ноге. А всего-лишь родили сложное процедурное программирование с неявным this аргументом и over 100500 правил с каким-то нагромождением рулов типа там правила поведения protected и прочего говна типа конструкторы и деструкторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2017, 23:57 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
teo609С++. Большинство фишек из 11,14, 17 версий уводят все дальше от этого базового уровня. Становясь более мощным, язык позволяет все более сложные концепции и приемы, это повышает требования к программистам, уменьшает их число, повышает порог вхождения При ближайшем рассмотрении, сложность концепций в большинстве случаев вызывается нежеланием старперов изучать что-либо новое ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 01:51 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
boobyЗавели себе козу статической типизации с выдумыванием обрядов моления на неенет ничего плохого в статической типизации :) Почему все обязательно становятся адептами или той или иной типизации? С++ хорош тем, что можно выбрать и настроить в нужном месте кода нужную типизацию. Или ненужную. И всё равно это будет работать!maytonПросто ООП себя исчерпало.а какие есть альтернативы? Концептуальные? Причём, чтобы можно было решать те же задачи, что решались с помощью ООП. Чем заменить ООП? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 05:10 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMbа какие есть альтернативы? Концептуальные? Причём, чтобы можно было решать те же задачи, что решались с помощью ООП. Чем заменить ООП? Вы уже говорите с позиции замены всего-того что написано. А зачем заменять? Просто не надо так делать. Реляционная алгебра (SQL/DDL) на 99.99% не использует ООП. И хотя базовые возможности ООП заложены в какой-то там Ansi-200* SQL, его всё равно не используют ибо для бизнес-логики в слое DBMS на это по большему насрать. А в С++ большинство ООП-решений - это сплошное овер-проектирование. ООП - фетиш. И персональный мозговой онанизм самого автора кода. Просто ему (автору) нравится использовать ООП-паттернализм так-же как и Гоголевскому Петрушке нравилось когда "буквы складываются в слова". Выкосите большую половину ООП из вашего кода и ничего у вас не изменится. Всё так-же будет работать. Бизнесу по большему счету все равно что у вас под капотом. ООП или кортежи, структуры, записи, сеты, data-rows. Поэтому на вопрос "как сделать" у меня другой ответ - не делайте так. Никогда не делайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 08:29 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
maytonВы уже говорите с позиции замены всего-того что написано. А зачем заменять? Просто не надо так делать.Нет, мне хотелось бы дополнить чем-то. Не надо заменять. maytonА в С++ большинство ООП-решений - это сплошное овер-проектирование. ООП - фетиш. И персональный мозговой онанизм самого автора кода.Ну это не всегда так. ООП это концепция, и в её рамках можно что-то делать. Конечно, как и везде, случается, что ООП ради ООП, но это же не повсеместно. Есть задачи, которые хорошо ложатся на ООП. И, всё правильно: поэтому не надо всё пытаться положить на ООП. Потому я и задал вопрос: какие есть альтернативы? maytonВыкосите большую половину ООП из вашего кода и ничего у вас не изменится. Всё так-же будет работать.ну это тоже не всегда так: организация данных и работы с ними всё-таки упрощает разработку. Конечно, всё, что написано на сяхх можно написать на сях, но времени надо будет больше, ошибок будет больше и так далее. maytonПоэтому на вопрос "как сделать" у меня другой ответ - не делайте так. Никогда не делайте.а что делать, если делать всё равно надо? :) С++, тем временем, продолжает развиваться сам по себе, даже не касаемо ООП, что позволяет придумывать и реализовывать новые концепции. Наверно, позволяет, я не знаю. Ну, т.е. я их не вижу, я про них не знаю, может они уже есть, вот я про них и спрашиваю: есть ли они? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 09:07 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMbНу это не всегда так. ООП это концепция, и в её рамках можно что-то делать. Конечно, как и везде, случается, что ООП ради ООП, но это же не повсеместно. Есть задачи, которые хорошо ложатся на ООП. И, всё правильно: поэтому не надо всё пытаться положить на ООП. Потому я и задал вопрос: какие есть альтернативы? Мне пожалуй будет интересно говорить об альтернативах тогда, когда я увижу какое-то value в написанном коде. Мне вообще интересны такие хештеги как #алгоритмы, #базыданных, #структуры_данных, и интересные задачи и парадоксы. А теперь вернёмся к тому что написал Саша в 1-м посте. О чём это? Какую задачу это решает? Как много мы с вами, коллеги согласны потратить времени на разглядывание очередного "грязного пальца" на ноге? Я в скобках даже скажу что не понимаю мотиваций к созданию подобного рода топиков. Но поскольку Саша - мембер класса "любопытный" - то ему это интересно и он спрашивает все что интересно. Далее вы говорите что есть класс задач которые хорошо ложаться на ООП. Я согласен. Существуют. Но их не много. А что насчет всех остальных задач то там ООП не нужно. И используйте ваш С++ без ООП. Благо в нём и так полно всяких "фич" облегчающих рутину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 09:46 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
maytonИ используйте ваш С++ без ООП. ООП - это просто модульность, сделанная как надо. Говорить что лучше писать программы без ООП все равно, что говорить что лучше всю программу в одном файле написать. Один файл это же намного проще нескольких )). Ну да, написать можно. Прочесть и пофиксить нельзя maytonВыкосите большую половину ООП из вашего кода и ничего у вас не изменится. Всё так-же будет работать. Я даже больше скажу. Если весь код заменить на машинный, то тоже все будет также работать. И опять же, все упростится. Никаких тебе деструкторов и прочих гиперсложных концепций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 12:11 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
CEMbboobyЗавели себе козу статической типизации с выдумыванием обрядов моления на неенет ничего плохого в статической типизации :) ... Имхо, это перевернутое утверждение. Можно даже хорошее найти или придумать. (Найти - исключение ошибок-описок технического сорта, придумать - якобы "упрощается" управление проектами со сложной структурой). Плоха не статическая типизация сама по себе, а заявления о том, что другой типизации для вас в нашем языке не будет. Имхо, основано это на представлениях создателей языка о тех людях, которые будут этот язык использовать и списке целей, которые они себе ставят при создании языка. И у разработчиков С++ наилучшие, идеально благоприятные для прикладного программиста представления о нем, программисте, как о существе разумном, в целом представляющим неплохо, что он собирается сделать и почему именно так. Но, так как в списке целей - главная и единственная существенная - написать такой компилятор, который будет создавать итоговый код, заведомо лучшего, с точки зрения создателя, качества, чем это сможет сделать любой силы прикладной программист, то результат сопоставим с результатом прочих создавальщиков языков со статической типизацией. Мы, создавальщики таких языков, существуем не для того, чтобы вы на нем программы писали, а чтобы наш компилятор был всегда лучше вас - живых недоумков, клацающих клавишами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 13:40 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
booby, ОМГ, а ты вообще как понимаешь, зачем нужна статическая типизация? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 13:46 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Siemargl, Вы слишком многого хотите от человека который пишет такое boobyразность двух нечетных чисел всегда есть нечетное число. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 14:26 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Siemarglbooby, ОМГ, а ты вообще как понимаешь, зачем нужна статическая типизация? мой предыдущий пост как бы намекает, главным образом - 100% за тем же, за чем нужно структурное программирование - для создания предмета гордости разработчику компилятора. Все остальные цели вторичны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 14:28 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskySiemargl, Вы слишком многого хотите от человека который пишет такое boobyразность двух нечетных чисел всегда есть нечетное число.Т.е мало того, что не нашел профильный форум по всяким яваскриптам, так и еще полагает, что один человек способен писать только на одном языке =) Бедняга. Но весна же, март, пятница, кризис. Понять и простить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:02 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
boobyструктурное программирование - для создания предмета гордости разработчику компилятора.мягкое и тёплое перепутал, да ладно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 15:29 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Siemargl... Т.е мало того, что не нашел профильный форум по всяким яваскриптам... :)) в отличие от марта и пятницы это не бьющееся и не проходящее. Ладно, развлекайтесь без меня, раз не хотите, чтобы я вас развлекал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 16:28 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Изопропилboobyструктурное программирование - для создания предмета гордости разработчику компилятора.мягкое и тёплое перепутал, да ладно И что? То есть можно привести какую-то другую вменяемую формулировку причины того, что у программы должен быть один вход и один выход? Хоть сегодня и пятница, а я даже готов запастись любопытством по этому поводу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 16:31 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
booby, какое отношение имеет структурное программирование к разработке компиляторов? к созданию ЯП - имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 17:11 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
boobyЛадно, развлекайтесь без меня, раз не хотите, чтобы я вас развлекал.до Ксеноцефала тебе ещё далеко, треннируйся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 17:13 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Изопропилbooby, какое отношение имеет структурное программирование к разработке компиляторов? к созданию ЯП - имеет. Вот так так. Вот они какие - теплое и мягкое, оказывается. Изобретатель ЯП, заставляющий свой ЯП приседать под структурное программирование, не думает о программисте (то есть, если и думает, то обязательно плохо), он думает о создании такого языка, компиляция текста которого генерирует программы гарантированно (с его точки зрения) лучшего качества, чем сможет догадаться . И этому использующий ЯП прикладной программист обязан не мешать - не мешать компилятору компилировать, генерируя из любых текстов плохого прикладного программиста хорошие программы. Здесь сначала думают о том, что и как должен делать компилятор, причем в этих историях - обязательно оптимизирующий, а потом - какие возможности не включать в язык. "Структурное программирование" - это не способ программирования, а набор гарантий для оптимизирующего компилятора об области переламывания кода прикладного программиста на вкус оптимизирующего компилятора. Единственный способ заставить прикладника не мешать компилировать - исключить из языка возможности, препятствующие компилятору коверкать код прикладного программиста. Само идея структурного программирования, в отрыве от мечты создания "идеального" компилятора, имхо, вообще не имеет почвы для возникновения. Все эти шпагоглататели, вилкопоедатели и создатели ЯП с оптимизирующими компиляторами - они все с богом соревнуются, стоя как зевсы, кто рожая компиляторы к языкам с запрещенным goto прямо из мозга, а кто засовывая вилки и шпаги прямо в мозг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 17:50 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
booby, структурное с объектно-ориентированным спутал? продолжай пытаться развлекать публику ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 20:09 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
boobyон думает о создании такого языка, компиляция текста которого генерирует программы гарантированно (с его точки зрения) лучшего качества, чем сможет догадаться . вроде 2017 год за окном, а не 1957 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 20:11 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
booby, тут все банально просто: делаешь структурно, все в одном экземпляре, а завтра становится надо в двух! И ... приплыли :( Классы это как минимум область видимости переменных, я их так в основном и использую. Хочешь два объекта создай, хочешь четыре. Более сложные извраты ООП типа наследования тут вообще не нужны. ИМХО есть три языка: С, С с классами и С++. Я второго придерживаюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 20:26 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Изопропилbooby, структурное с объектно-ориентированным спутал? продолжай пытаться развлекать публику как-то вяло ты комментируешь, совсем без ентузазизьма. да еще и тухлое "объектно-орентированное" программирование приплел на сон грядущий. А что до 2017 года по сравнению 1975 - это да, в 2017 моднее было бы модель памяти обсуждать, а не структурное программирование. Но даже начинать бессмысленно - и так ясно, что ты скажешь по этому поводу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2017, 23:43 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
booby, не очень понятно, что именно вы пытаетесь доказать.. maytonПросто ООП себя исчерпало. В нём ковырялись 30 лет как в грязном пальце на ноге. А всего-лишь родили сложное процедурное программирование с неявным this аргументом и over 100500 правил с каким-то нагромождением рулов типа там правила поведения protected и прочего говна типа конструкторы и деструкторы. Марк, что за ненависть к ООП?) И почему конструкторы стали "говном"? maytonА теперь вернёмся к тому что написал Саша в 1-м посте. О чём это? Какую задачу это решает? Как много мы с вами, коллеги согласны потратить времени на разглядывание очередного "грязного пальца" на ноге? Я в скобках даже скажу что не понимаю мотиваций к созданию подобного рода топиков. Но поскольку Саша - мембер класса "любопытный" - то ему это интересно и он спрашивает все что интересно. Далее вы говорите что есть класс задач которые хорошо ложаться на ООП. Я согласен. Существуют. Но их не много. А что насчет всех остальных задач то там ООП не нужно. И используйте ваш С++ без ООП. Благо в нём и так полно всяких "фич" облегчающих рутину. Мы вроде-бы не офисный планктон, чтобы разглядывать пустые листы А4с 8 до 17, потому иногда можно посмотреть и на пальцы, пусть и грязные. Хотя я лично не считаю, что тему виртуальных функций можно с этим сравнить. Более того, топики закрываются также быстро, как и открываются, когда-то закрыли шикарную задачу над которой я думал несколько дней 11111011111.c, после этого на закрытие топа о виртуальных функциях я точно не обижусь) Я спать, на выходных постараюсь закончить по существу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 01:40 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
boobySiemarglbooby, ОМГ, а ты вообще как понимаешь, зачем нужна статическая типизация? мой предыдущий пост как бы намекает, главным образом - 100% за тем же, за чем нужно структурное программирование - для создания предмета гордости разработчику компилятора. Все остальные цели вторичны. Ну, ты неправ. Не, не так. "Booby, ты неправ!" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 04:13 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
boobySiemargl... Т.е мало того, что не нашел профильный форум по всяким яваскриптам... :)) в отличие от марта и пятницы это не бьющееся и не проходящее. Ладно, развлекайтесь без меня, раз не хотите, чтобы я вас развлекал. Мы хотим, чтобы ты нас развлекал, и чтобы мы тебя. И вообще. Ну как бы ты неправ, потому что в C++ не только статическая типизация есть. т. е. типизация всегда статическая , но то, что ты отчасти подразумеваешь под этим словом, есть и другого вида, например, почти "утиная" типизация как в, скажем, Питоне, на шаблона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 04:25 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Изопропилbooby, структурное с объектно-ориентированным спутал? продолжай пытаться развлекать публику так, давайте пожалуйста мне тут оппонентов не грубить! каждый имеет право на мнение, в свободной стране живем, и т. д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 04:29 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercury, у меня нет ненависти к ООП. У меня есть бесконечное изумление. ООП - это всего лишь технический приём. Фича. Коих в современном ЯП более сотни. Но мы с упорством почитателей карго-культа из раза в раз поднимем один и тот-же топик. Неужели нельзя почитать спеку? Сдедать макет. Runn-ить 1 раз и сделать вывод. Дада. Я плюсую даже за последний кейс. И я-бы так поступил. И это правильно. Программирование это инженерное исскусство. Ребята! Инженеры! Коллеги. Неужели у вас нет других тем? Откройте новости науки и техники. Миссия на Марс. Исследование снимков космоса. Новые открытия в области ракетных двигателей. Интернет вещей. Диагностика сердечных заболеваний по сведениям от пульсомеров. Современная математика. Проблемы Гильберта которые не решены. Языки программирования. Мартин Одерский создает salable language который вобрал в себя все парадигмы всех языков. Новые модели мультизадачности. Акторы. Которые мы обсуждаем в смежном топике. Квантовые вычисления. Нейронные сети. Машииное зрение. Роевый интеллект. Здесь есть релевантные к С++ темы! Да есть! Есть библиотеки. Фреймворки. Есть юзкейсы. Но неужели чорт вас возьми, господа мы 30 лет будем обсуждать этот технический приём с двумя классами!? Это знаете-ли как в университете на курсе матана внезапно обратиться к профессуре с вопросом о решении квадратных уравнений. Это пошло. И стыдно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 14:03 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SashaMercuryМы вроде-бы не офисный планктон, чтобы разглядывать пустые листы А4с 8 до 17, потому иногда можно посмотреть и на пальцы, пусть и грязные. Хотя я лично не считаю, что тему виртуальных функций можно с этим сравнить. Более того, топики закрываются также быстро, как и открываются , когда-то закрыли шикарную задачу над которой я думал несколько дней 11111011111.c, после этого на закрытие топа о виртуальных функциях я точно не обижусь) Я спать, на выходных постараюсь закончить по существу Что за топик? Если мы его закрыли то видимо на то были основания. Подними ее снова но в нужном подфоруме и с нужной фомулировкой. Подчеркнутое я считаю как-бы брошенным упреком. Дескыть здесь (в sql.ru) что-то неправильно модерируют и кого-то избирательно обижают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2017, 14:20 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
MasterZivС точки зрения семантики виртуальных функций в С++, она, безусловно, контринтуитивна, потому что естественным для программиста было бы, если бы все методы были автоматом виртуальными. Появление в С++ необходимости явно требовать оформления вызова виртуальной функции как косвенного вызова через таблицу виртуальных методов безусловно связана с необходимостью обеспечить управление быстродействием результирующей программы, получаемой из исходного кода. И хотя в общем стоимость виртуального вызова не так уж и сильно больше стоимости вызова обычного (оба на самом деле достаточно высоки, потому что надо формировать аргументы и переключать стек), во времена появления С++, наверное, разработчики боялись всего-всего, и я полагаю, что Страустрап просто остерёгся делать все поголовно функции виртуальными. В более современных языках, которые являются наследниками С++, -- Java и C# -- виртуальные вызовы делаются автоматически везде. Не знаю как я сразу не прочитал. BS действительно упоминает о том, насколько настороженно общественность отнеслась к виртуальным функциям. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2017, 00:25 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#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 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SiemarglЭлементарно Код: plaintext 1. 2. 3. 4. 5. Ну, и какой инфы компилятору не хватает чтобы сгенерировать код для всех пар base-derived? )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 12:46 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, реальная пара будет известна только в рантайме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 13:30 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Siemarglреальная пара будет известна только в рантайме Да, как только становится известно значение указателя vtable - сразу понятно какая пара. Никакой дополнительной инфы хранить не надо. Там тупо простейший switch: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Если какие-то компиляторы этот switch, состоящий в большинстве случаев из пары условных переходов и вызовов пустых инлайн функций, реализуют как какие-то лукапы в каких-то таблицах связанных с RTTI - это проблема этих компиляторов. Говорить, что это все должно быть в RTTI - нонсенс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 13:52 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
SiemarglAnatoly Moskovsky, реальная пара будет известна только в рантайме почему пара? Base вообще фиксирован, если это не шаблонная функция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 14:40 |
|
||
|
К виртуальным функциям
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, У тебя так все просто. А файл rtti.c из сорцов gcc имеет худо бедно 1600 строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 15:56 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018245]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
137ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 219ms |

| 0 / 0 |
