|
static virtual function |
|
11.03.2004, 17:54
|
#1
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
static virtual function
интересно, почему в c++ нет статические функции невозможно сделать виртуальными? не думаю, что с реализацией возникли бы какие-то технические трудности - все реализуется так же, как с обычными функциями, только this не предается. зато можно было бы по динамическому указателю вызывать и статические функции класса... в комитете посчитали этот случай слишком редким и ненужным?
|
|
|
11.03.2004, 18:31
|
#2
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
то, что ты предлагаешь (предполагаешь), звучит так /если я правильно сформулировал для себя/:
разрешите статические виртуальные ф-ции, но так, чтоб они принимали как минимум 1 параметр - указатель на динамические объекты.
/потому что в ином случае статический виртуальный мембер становится out-of-use/
принуждать программеров нехорошо, не так ли ?
|
|
|
11.03.2004, 18:41
|
#3
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
Quote:
Originally Posted by greka
то, что ты предлагаешь (предполагаешь), звучит так /если я правильно сформулировал для себя/:
разрешите статические виртуальные ф-ции, но так, чтоб они принимали как минимум 1 параметр - указатель на динамические объекты.
|
нет, пусть сигнатура остается такой же, как сейчас, так что ее можно вызвать и от класса. но если вызывать динамически, то тип класса через указатель на объект определяется динамически, а не как сегодня - статически
|
|
|
11.03.2004, 18:58
|
#4
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
а динамически - это как?
положим, ты - компилятор.
как ты будешь различать, кто этот метод вызвал ?
|
|
|
11.03.2004, 20:23
|
#5
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
|
В новом стандарте С++ собираются ввести мультиметоды, сейчас есть реализации в некоторых библиотеках. А статическая функция по определению не может быть виртуальной.
Тебе скорее всего нужна callcback или потоковая функция... так для этого есть методы.
|
|
|
12.03.2004, 06:16
|
#6
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
Quote:
Originally Posted by greka
а динамически - это как?
положим, ты - компилятор.
как ты будешь различать, кто этот метод вызвал ?
|
для статической функции компилятор обычным же способом записывает ее адрес в виртуальную таблицу, а при вызове через полиморфный указатель, замечая, что функция объявлена виртуальной, вызывает через таблицу, только поскольку ему известно, что она статична, он не передает адрес объекта
|
|
|
12.03.2004, 09:38
|
#7
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
|
Понимаешь как, виртуальная функция - требует наличия объекта - статическая не требует. Ты ее можешь вывать, как CMyMother****ingClass::MyMother****ingStaticFunction(); - a если нет объекта - тогда нет виртуальной таблицы.
|
|
|
12.03.2004, 11:10
|
#8
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
Quote:
Originally Posted by Agregat
Понимаешь как, виртуальная функция - требует наличия объекта - статическая не требует. Ты ее можешь вывать, как CMyMother****ingClass::MyMother****ingStaticFunction(); - a если нет объекта - тогда нет виртуальной таблицы.
|
понимаю, но статическая имеет два способя вызова - через имя класса и через объект. во втором случает конечно объект ей не передается, но компилятор мог бы использовать его для доступа к таблице. ну а в первом вызывать как есть
|
|
|
12.03.2004, 12:19
|
#9
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
|
то есть получается компилятор должен решать это просто статическая, а это виртуальная статическая? Фигня выходит. Сделай сам, как грицца:
PHP Code:
class CBase
{
...
static VirtualProcessing(CBase * theBase) {theBase->myVirtualFunc();}
virtual void myVirtualFunc() = 0;
};
class CD1 : public CBase
{
void myVirtualFunc() {cout << "CD1" <<endl;
};
class CD2 : public CBase
{
void myVirtualFunc() {cout << "CD2" <<endl;
};
int main()
{
vector<CBase*> vec;
/// some code
for (vector<CBase*>::iterator i = vec.begin(), e = vec.end(); i != e; ++i)
{
(*i)->VirtualProcessing(*i);
}
return 0;
}
вот и все.
|
|
|
12.03.2004, 13:04
|
#10
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
это конечно решение, но не такое красивое, как виртуальная статическая функция. а если красота - субъективный аргумент, то вот и объективный: написание дополнительной функции и передача параметра в статическую функцию
|
|
|
12.03.2004, 14:33
|
#11
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
|
могу красивее: прицепи к проекту boost.lambda там есть функтор bind, который просто будет вызывать эту фунцкию и код будет таким
PHP Code:
///...
std::for_each(vec.begin(), vec.end(), boost::lambda::bind(CBase::VirtualProcessing, _1));
///....
Красиво, элегантно, эстетично.
|
|
|
12.03.2004, 14:46
|
#12
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
мой вопрос носит исключительно теоретический характер, и я хочу только знать, почему эту возможность не реализовали, а не альтернативные пути реализации
Last edited by Aram Hambardzumyan; 13.03.2004 at 08:11.
|
|
|
12.03.2004, 20:21
|
#13
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
|
Я сказал выше, что это неправильно. Статическая функция на то и статическая, чтобы не быть виртуальной.
|
|
|
13.03.2004, 08:19
|
#14
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
Quote:
Originally Posted by Agregat
Я сказал выше, что это неправильно. Статическая функция на то и статическая, чтобы не быть виртуальной.
|
это неправильно только потому, что так решили при создании и стандартизации языка. а могли бы и допустить статические виртуальные функции, я не вижу этому технических помех. вопрос в том, почему не сделали?
|
|
|
13.03.2004, 10:27
|
#15
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
|
чтобы была виртуальной требуется this. если же она статическая - то получается разное поведение когда она вызывается, как CMyClass::Func() и CBase->Func()
|
|
|
All times are GMT. The time now is 02:53. |
|
|