Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters

Reply
 
Thread Tools

static virtual function
Old 11.03.2004, 17:54   #1
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Default static virtual function

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

Old 11.03.2004, 18:31   #2
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
Default

то, что ты предлагаешь (предполагаешь), звучит так /если я правильно сформулировал для себя/:

разрешите статические виртуальные ф-ции, но так, чтоб они принимали как минимум 1 параметр - указатель на динамические объекты.

/потому что в ином случае статический виртуальный мембер становится out-of-use/


принуждать программеров нехорошо, не так ли ?

Old 11.03.2004, 18:41   #3
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Default

Quote:
Originally Posted by greka
то, что ты предлагаешь (предполагаешь), звучит так /если я правильно сформулировал для себя/:

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

Old 11.03.2004, 18:58   #4
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
Default

а динамически - это как?
положим, ты - компилятор.

как ты будешь различать, кто этот метод вызвал ?

Old 11.03.2004, 20:23   #5
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
Default

В новом стандарте С++ собираются ввести мультиметоды, сейчас есть реализации в некоторых библиотеках. А статическая функция по определению не может быть виртуальной.
Тебе скорее всего нужна callcback или потоковая функция... так для этого есть методы.

Old 12.03.2004, 06:16   #6
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Default

Quote:
Originally Posted by greka
а динамически - это как?
положим, ты - компилятор.

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

Old 12.03.2004, 09:38   #7
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
Default

Понимаешь как, виртуальная функция - требует наличия объекта - статическая не требует. Ты ее можешь вывать, как CMyMother****ingClass::MyMother****ingStaticFunction(); - a если нет объекта - тогда нет виртуальной таблицы.

Old 12.03.2004, 11:10   #8
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Default

Quote:
Originally Posted by Agregat
Понимаешь как, виртуальная функция - требует наличия объекта - статическая не требует. Ты ее можешь вывать, как CMyMother****ingClass::MyMother****ingStaticFunction(); - a если нет объекта - тогда нет виртуальной таблицы.
понимаю, но статическая имеет два способя вызова - через имя класса и через объект. во втором случает конечно объект ей не передается, но компилятор мог бы использовать его для доступа к таблице. ну а в первом вызывать как есть

Old 12.03.2004, 12:19   #9
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
Default

то есть получается компилятор должен решать это просто статическая, а это виртуальная статическая? Фигня выходит. Сделай сам, как грицца:
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(), vec.end(); != e; ++i)
  {
     (*
i)->VirtualProcessing(*i);
  }
  return 
0;

вот и все.

Old 12.03.2004, 13:04   #10
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Default

это конечно решение, но не такое красивое, как виртуальная статическая функция. а если красота - субъективный аргумент, то вот и объективный: написание дополнительной функции и передача параметра в статическую функцию

Old 12.03.2004, 14:33   #11
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
Default

могу красивее: прицепи к проекту boost.lambda там есть функтор bind, который просто будет вызывать эту фунцкию и код будет таким
PHP Code:
///...
std::for_each(vec.begin(), vec.end(), boost::lambda::bind(CBase::VirtualProcessing_1));
///.... 
Красиво, элегантно, эстетично.

Old 12.03.2004, 14:46   #12
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Default

мой вопрос носит исключительно теоретический характер, и я хочу только знать, почему эту возможность не реализовали, а не альтернативные пути реализации

Last edited by Aram Hambardzumyan; 13.03.2004 at 08:11.

Old 12.03.2004, 20:21   #13
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
Default

Я сказал выше, что это неправильно. Статическая функция на то и статическая, чтобы не быть виртуальной.

Old 13.03.2004, 08:19   #14
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
Default

Quote:
Originally Posted by Agregat
Я сказал выше, что это неправильно. Статическая функция на то и статическая, чтобы не быть виртуальной.
это неправильно только потому, что так решили при создании и стандартизации языка. а могли бы и допустить статические виртуальные функции, я не вижу этому технических помех. вопрос в том, почему не сделали?

Old 13.03.2004, 10:27   #15
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 42
Posts: 21,717
Rep Power: 9
Default

чтобы была виртуальной требуется this. если же она статическая - то получается разное поведение когда она вызывается, как CMyClass::Func() и CBase->Func()
Reply




Реклама:
реклама

All times are GMT. The time now is 02:53.
Top

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.