Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> static virtual function 
:(
    Опции темы
gr1fon
Дата 23.8.2007, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.8.2007

Репутация: 1
Всего: 1



Пытаюсь разобраться с static virtual functions. Объясните пожалуйста для чего они нужны smile
PM MAIL   Вверх
Void
Дата 23.8.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Ну, сам придумал — сам и разбирайся smile

Серьёзно, нет такого в C++, и ни в одном языке нет, потому что само сочетание бессмысленно.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
zkv
Дата 23.8.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(gr1fon @  23.8.2007,  21:39 Найти цитируемый пост)
Пытаюсь разобраться с static virtual functions. 

таких не бывает, это ты где нашел употребление такого термина?
PM MAIL   Вверх
gr1fon
Дата 23.8.2007, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.8.2007

Репутация: 1
Всего: 1



Вот здесь увидел подобную конструкцию: http://www.gamedev.ru/code/forum/?id=64645 smile
PM MAIL   Вверх
Daevaorn
Дата 23.8.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Это опечатка. Такой конструкции не существует в С++.
PM MAIL WWW   Вверх
zkv
Дата 23.8.2007, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(gr1fon @  23.8.2007,  22:01 Найти цитируемый пост)
Вот здесь увидел подобную конструкцию: http://www.gamedev.ru/code/forum/?id=64645 

там  термин "static virtual functions" использовался условно.
PM MAIL   Вверх
Xenon
Дата 23.8.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Да, а то статическое динамическое связывание звучит как-то интересно smile


--------------------
user posted image  
PM MAIL   Вверх
UnrealMan
Дата 23.8.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Void @  23.8.2007,  21:47 Найти цитируемый пост)
потому что само сочетание бессмысленно

Ну, не совсем. Ведь можно ж статический метод вызывать так же, как нестатический:

Код
#include <iostream>
#include <ostream>

struct A
{
    static void f() { std::cout << "static method" << std::endl; }
};

int main()
{
    A().f(); // OK
}

Так что могли бы быть статические виртуальные функции, вот только не нужны они никому smile 
PM MAIL   Вверх
zkv
Дата 23.8.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(UnrealMan @  23.8.2007,  23:09 Найти цитируемый пост)
Так что могли бы быть статические виртуальные функции

это как? И к какому объекту она привязывалась бы? Она ведь this не получает.
PM MAIL   Вверх
UnrealMan
Дата 23.8.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Ну я же показал пример.

Добавлено через 3 минуты и 16 секунд
Вот такой код вполне мог бы работать:

Код
class C1
{
public:
    virtual static void f() {}
};

class C2 : public C1
{
public:
    static void f() {}
};

void f()
{
    C2 c2;
    C1* p = &c2;
    p->f(); // C2::f()
}


PM MAIL   Вверх
zkv
Дата 23.8.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



UnrealMan, и что, для того чтобы понять метод какого класса запускать функция должна иметь таблицу виртуальных методов, те нужен this, те в твою "статическую" функцию нужно неявно его передать - а это уже нестатический метод получится smile
PM MAIL   Вверх
Xenon
Дата 23.8.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



UnrealMan, мог бы, да не работает. Покажи мне кто это скомпилирует.
Код

error C2216: 'virtual' cannot be used with 'static'
warning C4526: 'C2::f' : static member function cannot override virtual function 'void C1::f(void)'
  override ignored, virtual function will be hidden
  see declaration of 'C1::f'



--------------------
user posted image  
PM MAIL   Вверх
zkv
Дата 23.8.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Xenon, мы гипотетически рассматриваем вопрос smile
PM MAIL   Вверх
Void
Дата 23.8.2007, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(zkv @  24.8.2007,  01:27 Найти цитируемый пост)
для того чтобы понять метод какого класса запускать функция должна иметь таблицу виртуальных методов

Да.
Цитата(zkv @  24.8.2007,  01:27 Найти цитируемый пост)
те в твою "статическую" функцию нужно неявно его передать - а это уже нестатический метод получится

VMT теоретически может содержать указатель на самую обыкновенную функцию, и ничего передавать не понадобится.

Но я не могу придумать ни одного практического применения такому варианту.



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
UnrealMan
Дата 23.8.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(zkv @  23.8.2007,  23:27 Найти цитируемый пост)
те нужен this, те в твою "статическую" функцию нужно неявно его передать - а это уже нестатический метод получится 

Зачем передавать что-то в саму функцию? В зависимости от динамического типа объекта могла бы вызываться нужная функция и всё.


Цитата(Xenon @  23.8.2007,  23:27 Найти цитируемый пост)
UnrealMan, мог бы, да не работает.

Именно поэтому "мог бы" smile
PM MAIL   Вверх
zkv
Дата 23.8.2007, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



то ли лыжи у меня не едут... 
Какое из следующих утверждений неверно?
 - объектов одной иерархии классов может быть много
 - каждый инстанцирован определенным классом из этой иерархии => имеет собственную таблицу методов
 - статическая функция не получает никаких сведений об объектах, иначе она уже не статическая
Цитата(UnrealMan @  23.8.2007,  23:40 Найти цитируемый пост)
В зависимости от динамического типа объекта могла бы вызываться нужная функция и всё.

какого объекта? Как она должна узнать, о каком объекте идет речь?
PM MAIL   Вверх
UnrealMan
Дата 23.8.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(zkv @  23.8.2007,  23:53 Найти цитируемый пост)
какого объекта?

по-моему, из приведённых мной примеров это вполне ясно.
PM MAIL   Вверх
zkv
Дата 24.8.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(UnrealMan @  23.8.2007,  23:59 Найти цитируемый пост)
по-моему, из приведённых мной примеров это вполне ясно. 

тебе - да, компилятору нет. 
в нестатические методы класса неявно передается указатель this, в статические он не передается, даже если ты запишешь:
Код

obj.StaticMethod()

он туда передан не будет, иначе функция не будет статической.
PM MAIL   Вверх
UnrealMan
Дата 24.8.2007, 00:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(zkv @  24.8.2007,  00:04 Найти цитируемый пост)
тебе - да, компилятору нет. 

Можно сделать, чтоб было ясно и компилятору.
 
Цитата(zkv @  24.8.2007,  00:04 Найти цитируемый пост)
в нестатические методы класса неявно передается указатель this, в статические он не передается

Да какая вообще разница, передаётся указатель в функцию или не передаётся? smile:
PM MAIL   Вверх
zkv
Дата 24.8.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(UnrealMan @  24.8.2007,  00:07 Найти цитируемый пост)
Да какая вообще разница, передаётся указатель в функцию или не передаётся?

дык а как иначе определить, чем наш объект инстанцирован? 
блин, какой объект... те какой именно метод вызывать - для этого нужна таблица методов, она привязана к объекту, притом: 
Цитата(zkv @  23.8.2007,  23:53 Найти цитируемый пост)
- каждый инстанцирован определенным классом из этой иерархии => имеет собственную таблицу методов



Это сообщение отредактировал(а) zkv - 24.8.2007, 00:13
PM MAIL   Вверх
UnrealMan
Дата 24.8.2007, 00:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Определение того, какую именно функцию нужно вызывать, происходит до вызова нужной функции (логично, не правда ли?)

Это сообщение отредактировал(а) UnrealMan - 24.8.2007, 00:14
PM MAIL   Вверх
zkv
Дата 24.8.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(UnrealMan @  24.8.2007,  00:13 Найти цитируемый пост)
Определение того, какую именно функцию нужно вызывать, происходит до вызова нужной функции (логично, не правда ли?)

не понял ничего, ну да ладно.

UnrealMan, когда ты добьешься того чтобы:
Цитата(UnrealMan @  24.8.2007,  00:07 Найти цитируемый пост)
Можно сделать, чтоб было ясно и компилятору.

ты получишь из своего статического метода обычный (нестатический) метод. 
Все, я выхожу из спора.
PM MAIL   Вверх
Daevaorn
Дата 24.8.2007, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Если вдруг к С++ прикруить хороший рефлекшен и перевести его в разряд динамических языков, то все классы можно рассматривать самих  как объекты с определенными свойствами. тогда статические методы можно считать простыми методами класса, где под this можно понимать сам инстанс класса(не путать с объектом).Тогда идея виртуальных статических методов преобретает разумный вид, но как уже сказал выше zkv есть много проблем. так что это всё сказки и не нужно в С++.
PM MAIL WWW   Вверх
archimed7592
Дата 24.8.2007, 01:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Void @  23.8.2007,  23:34 Найти цитируемый пост)
Но я не могу придумать ни одного практического применения такому варианту.

Применение прямое: виртуальный конструктор(паттерн такой).

zkv, чё ты проблему раздуваешь на пустом месте.
Возьмём обыкновенные виртуальные ф-ции.
Когда их вызывают так:
Код
obj.f();
/*this->*/f();

То происходит вычисление адреса необходимой ф-ции(в зависимости от динамического типа объекта).
Когда же их вызывают так:
Код
obj.MyClass::f();
/*this->*/MyClass::f();

То никакого вычисления не происходит и ф-ция вызывается вполне определённая на этапе компиляции(на основе статического типа объекта).

Компилятору всё ясно в данном случае? Отлично, продолжим...

Аналогично для статических виртуальных ф-ций.
Когда вызывают так:
Код
MyClass::sf();

То вызывается конкретная ф-ция, известная на этапе компиляции.
Когда вызывают так:
Код
obj.sf();

То на основе динамического типа объекта вызывается необходимая ф-ция.


Замечу, что такое нововведение даже не является breaking changes и может быть совершенно безболезненно включено в Стандарт. Думаю, там понадобится изменить только лишь пару строчек smile.

Добавлено через 4 минуты и 35 секунд
Цитата(zkv @  24.8.2007,  00:18 Найти цитируемый пост)
ты получишь из своего статического метода обычный (нестатический) метод. 

Нет, ты получишь обыкновенный статический метод, который можно будет точно так же, как и раньше вызывать без объекта, но если у тебя есть объект и ты хочешь произвести виртуальный вызов, то почему бы не дать возможность сделать это? Ну разрастётся немного таблица виртуальных ф-ций... ну не страшно.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
zkv
Дата 24.8.2007, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(archimed7592 @  24.8.2007,  01:17 Найти цитируемый пост)
zkv, чё ты проблему раздуваешь на пустом месте.

а ни чё  smile 
хотел более или менее аргументированный ответ получить, а не просто "А вот..."

Думаю над твоим ответом:
Цитата(archimed7592 @  24.8.2007,  01:17 Найти цитируемый пост)
Нет, ты получишь обыкновенный статический метод, который можно будет точно так же, как и раньше вызывать без объекта, но если у тебя есть объект и ты хочешь произвести виртуальный вызов, то почему бы не дать возможность сделать это?

пока не понимаю, чем в этом случае может не удовлетворить нестатический метод. 
Нельзя будет вызвать без создания объекта. Виртуальный конструктор говоришь? Посмотрим.
Продолжаю размышлять...
PM MAIL   Вверх
Любитель
Дата 23.9.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(archimed7592 @  24.8.2007,  01:17 Найти цитируемый пост)
виртуальный конструктор

Главное и ИМХО единственное применение. Впрочем стоящее. Кстати, прикол в том, что в Дельфи это есть smile И виртуальные конструкторы есть в чистом виде. И виртуальные статические методы (называемые класс-методами).


--------------------
PM MAIL ICQ Skype   Вверх
archimed7592
  Дата 23.9.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Любитель @  23.9.2007,  17:27 Найти цитируемый пост)
Кстати, прикол в том, что в Дельфи это есть smile

Угу, и в каждом холиваре они противопоставляют свои виртуальные конструкторы против шаблонов smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Любитель
Дата 23.9.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Может я ошибаюсь, но, по-моему, статический виртуальные функции и виртуальные конструкторы не сложно реализовать (синтаксис только для виртуальных конструкторов надо придумать smile ). Тем более, в принципе, последние заменимы первым, правда идеологически не идеально выглядит smile А вот реализация шаблонов посложней будет... ИМХО, правда.


--------------------
PM MAIL ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1468 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.