Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > static virtual function |
Автор: gr1fon 23.8.2007, 21:39 |
Пытаюсь разобраться с static virtual functions. Объясните пожалуйста для чего они нужны ![]() |
Автор: Void 23.8.2007, 21:47 |
Ну, сам придумал — сам и разбирайся ![]() Серьёзно, нет такого в C++, и ни в одном языке нет, потому что само сочетание бессмысленно. |
Автор: zkv 23.8.2007, 21:50 |
таких не бывает, это ты где нашел употребление такого термина? |
Автор: gr1fon 23.8.2007, 22:01 |
Вот здесь увидел подобную конструкцию: http://www.gamedev.ru/code/forum/?id=64645 ![]() |
Автор: Daevaorn 23.8.2007, 22:29 |
Это опечатка. Такой конструкции не существует в С++. |
Автор: Xenon 23.8.2007, 22:42 |
Да, а то статическое динамическое связывание звучит как-то интересно ![]() |
Автор: UnrealMan 23.8.2007, 23:09 | ||
Ну, не совсем. Ведь можно ж статический метод вызывать так же, как нестатический:
Так что могли бы быть статические виртуальные функции, вот только не нужны они никому ![]() |
Автор: zkv 23.8.2007, 23:10 |
это как? И к какому объекту она привязывалась бы? Она ведь this не получает. |
Автор: UnrealMan 23.8.2007, 23:13 | ||
Ну я же показал пример. Добавлено через 3 минуты и 16 секунд Вот такой код вполне мог бы работать:
|
Автор: zkv 23.8.2007, 23:27 |
UnrealMan, и что, для того чтобы понять метод какого класса запускать функция должна иметь таблицу виртуальных методов, те нужен this, те в твою "статическую" функцию нужно неявно его передать - а это уже нестатический метод получится ![]() |
Автор: Xenon 23.8.2007, 23:27 | ||
UnrealMan, мог бы, да не работает. Покажи мне кто это скомпилирует.
|
Автор: zkv 23.8.2007, 23:29 |
Xenon, мы гипотетически рассматриваем вопрос ![]() |
Автор: Void 23.8.2007, 23:34 | ||||
Да.
VMT теоретически может содержать указатель на самую обыкновенную функцию, и ничего передавать не понадобится. Но я не могу придумать ни одного практического применения такому варианту. |
Автор: UnrealMan 23.8.2007, 23:40 | ||
Зачем передавать что-то в саму функцию? В зависимости от динамического типа объекта могла бы вызываться нужная функция и всё. Именно поэтому "мог бы" ![]() |
Автор: zkv 23.8.2007, 23:53 | ||
то ли лыжи у меня не едут... Какое из следующих утверждений неверно? - объектов одной иерархии классов может быть много - каждый инстанцирован определенным классом из этой иерархии => имеет собственную таблицу методов - статическая функция не получает никаких сведений об объектах, иначе она уже не статическая
какого объекта? Как она должна узнать, о каком объекте идет речь? |
Автор: UnrealMan 23.8.2007, 23:59 |
по-моему, из приведённых мной примеров это вполне ясно. |
Автор: zkv 24.8.2007, 00:04 | ||
тебе - да, компилятору нет. в нестатические методы класса неявно передается указатель this, в статические он не передается, даже если ты запишешь:
он туда передан не будет, иначе функция не будет статической. |
Автор: UnrealMan 24.8.2007, 00:07 | ||
Можно сделать, чтоб было ясно и компилятору.
Да какая вообще разница, передаётся указатель в функцию или не передаётся? ![]() |
Автор: zkv 24.8.2007, 00:09 | ||||
дык а как иначе определить, чем наш объект инстанцирован? блин, какой объект... те какой именно метод вызывать - для этого нужна таблица методов, она привязана к объекту, притом:
|
Автор: UnrealMan 24.8.2007, 00:13 |
Определение того, какую именно функцию нужно вызывать, происходит до вызова нужной функции (логично, не правда ли?) |
Автор: zkv 24.8.2007, 00:18 | ||
не понял ничего, ну да ладно. UnrealMan, когда ты добьешься того чтобы: ты получишь из своего статического метода обычный (нестатический) метод. Все, я выхожу из спора. |
Автор: Daevaorn 24.8.2007, 00:32 |
Если вдруг к С++ прикруить хороший рефлекшен и перевести его в разряд динамических языков, то все классы можно рассматривать самих как объекты с определенными свойствами. тогда статические методы можно считать простыми методами класса, где под this можно понимать сам инстанс класса(не путать с объектом).Тогда идея виртуальных статических методов преобретает разумный вид, но как уже сказал выше zkv есть много проблем. так что это всё сказки и не нужно в С++. |
Автор: archimed7592 24.8.2007, 01:17 | ||||||||||||
Применение прямое: виртуальный конструктор(паттерн такой). zkv, чё ты проблему раздуваешь на пустом месте. Возьмём обыкновенные виртуальные ф-ции. Когда их вызывают так:
То происходит вычисление адреса необходимой ф-ции(в зависимости от динамического типа объекта). Когда же их вызывают так:
То никакого вычисления не происходит и ф-ция вызывается вполне определённая на этапе компиляции(на основе статического типа объекта). Компилятору всё ясно в данном случае? Отлично, продолжим... Аналогично для статических виртуальных ф-ций. Когда вызывают так:
То вызывается конкретная ф-ция, известная на этапе компиляции. Когда вызывают так:
То на основе динамического типа объекта вызывается необходимая ф-ция. Замечу, что такое нововведение даже не является breaking changes и может быть совершенно безболезненно включено в Стандарт. Думаю, там понадобится изменить только лишь пару строчек ![]() Добавлено через 4 минуты и 35 секунд
Нет, ты получишь обыкновенный статический метод, который можно будет точно так же, как и раньше вызывать без объекта, но если у тебя есть объект и ты хочешь произвести виртуальный вызов, то почему бы не дать возможность сделать это? Ну разрастётся немного таблица виртуальных ф-ций... ну не страшно. |
Автор: zkv 24.8.2007, 01:46 | ||
а ни чё ![]() хотел более или менее аргументированный ответ получить, а не просто "А вот..." Думаю над твоим ответом:
пока не понимаю, чем в этом случае может не удовлетворить нестатический метод. Нельзя будет вызвать без создания объекта. Виртуальный конструктор говоришь? Посмотрим. Продолжаю размышлять... |
Автор: Любитель 23.9.2007, 17:27 |
Главное и ИМХО единственное применение. Впрочем стоящее. Кстати, прикол в том, что в Дельфи это есть ![]() |
Автор: archimed7592 23.9.2007, 19:48 |
Угу, и в каждом холиваре они противопоставляют свои виртуальные конструкторы против шаблонов ![]() |
Автор: Любитель 23.9.2007, 20:24 |
Может я ошибаюсь, но, по-моему, статический виртуальные функции и виртуальные конструкторы не сложно реализовать (синтаксис только для виртуальных конструкторов надо придумать ![]() ![]() |