Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > static virtual function


Автор: gr1fon 23.8.2007, 21:39
Пытаюсь разобраться с static virtual functions. Объясните пожалуйста для чего они нужны smile

Автор: Void 23.8.2007, 21:47
Ну, сам придумал — сам и разбирайся smile

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

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

таких не бывает, это ты где нашел употребление такого термина?

Автор: gr1fon 23.8.2007, 22:01
Вот здесь увидел подобную конструкцию: http://www.gamedev.ru/code/forum/?id=64645 smile

Автор: Daevaorn 23.8.2007, 22:29
Это опечатка. Такой конструкции не существует в С++.

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

там  термин "static virtual functions" использовался условно.

Автор: Xenon 23.8.2007, 22:42
Да, а то статическое динамическое связывание звучит как-то интересно smile

Автор: UnrealMan 23.8.2007, 23:09
Цитата(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 

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

это как? И к какому объекту она привязывалась бы? Она ведь this не получает.

Автор: UnrealMan 23.8.2007, 23:13
Ну я же показал пример.

Добавлено через 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()
}


Автор: zkv 23.8.2007, 23:27
UnrealMan, и что, для того чтобы понять метод какого класса запускать функция должна иметь таблицу виртуальных методов, те нужен this, те в твою "статическую" функцию нужно неявно его передать - а это уже нестатический метод получится smile

Автор: Xenon 23.8.2007, 23:27
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'

Автор: zkv 23.8.2007, 23:29
Xenon, мы гипотетически рассматриваем вопрос smile

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

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

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

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

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

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


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

Именно поэтому "мог бы" smile

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

какого объекта? Как она должна узнать, о каком объекте идет речь?

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

по-моему, из приведённых мной примеров это вполне ясно.

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

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

obj.StaticMethod()

он туда передан не будет, иначе функция не будет статической.

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

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

Да какая вообще разница, передаётся указатель в функцию или не передаётся? smile:

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

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


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

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

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

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

ты получишь из своего статического метода обычный (нестатический) метод. 
Все, я выхожу из спора.

Автор: Daevaorn 24.8.2007, 00:32
Если вдруг к С++ прикруить хороший рефлекшен и перевести его в разряд динамических языков, то все классы можно рассматривать самих  как объекты с определенными свойствами. тогда статические методы можно считать простыми методами класса, где под this можно понимать сам инстанс класса(не путать с объектом).Тогда идея виртуальных статических методов преобретает разумный вид, но как уже сказал выше zkv есть много проблем. так что это всё сказки и не нужно в С++.

Автор: archimed7592 24.8.2007, 01:17
Цитата(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 Найти цитируемый пост)
ты получишь из своего статического метода обычный (нестатический) метод. 

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

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

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

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

пока не понимаю, чем в этом случае может не удовлетворить нестатический метод. 
Нельзя будет вызвать без создания объекта. Виртуальный конструктор говоришь? Посмотрим.
Продолжаю размышлять...

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)