Armenian Knowledge Base  

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

Reply
 
LinkBack Thread Tools
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
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default static virtual function

интересно, почему в c++ нет статические функции невозможно сделать виртуальными? не думаю, что с реализацией возникли бы какие-то технические трудности - все реализуется так же, как с обычными функциями, только this не предается. зато можно было бы по динамическому указателю вызывать и статические функции класса... в комитете посчитали этот случай слишком редким и ненужным?
Reply With Quote
Old 11.03.2004, 18:31   #2
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

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

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

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


принуждать программеров нехорошо, не так ли ?
Reply With Quote
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
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

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

разрешите статические виртуальные ф-ции, но так, чтоб они принимали как минимум 1 параметр - указатель на динамические объекты.
нет, пусть сигнатура остается такой же, как сейчас, так что ее можно вызвать и от класса. но если вызывать динамически, то тип класса через указатель на объект определяется динамически, а не как сегодня - статически
Reply With Quote
Old 11.03.2004, 18:58   #4
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

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

как ты будешь различать, кто этот метод вызвал ?
Reply With Quote
Old 11.03.2004, 20:23   #5
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

В новом стандарте С++ собираются ввести мультиметоды, сейчас есть реализации в некоторых библиотеках. А статическая функция по определению не может быть виртуальной.
Тебе скорее всего нужна callcback или потоковая функция... так для этого есть методы.
Reply With Quote
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
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

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

как ты будешь различать, кто этот метод вызвал ?
для статической функции компилятор обычным же способом записывает ее адрес в виртуальную таблицу, а при вызове через полиморфный указатель, замечая, что функция объявлена виртуальной, вызывает через таблицу, только поскольку ему известно, что она статична, он не передает адрес объекта
Reply With Quote
Old 12.03.2004, 09:38   #7
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Понимаешь как, виртуальная функция - требует наличия объекта - статическая не требует. Ты ее можешь вывать, как CMyMother****ingClass::MyMother****ingStaticFunction(); - a если нет объекта - тогда нет виртуальной таблицы.
Reply With Quote
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
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally Posted by Agregat
Понимаешь как, виртуальная функция - требует наличия объекта - статическая не требует. Ты ее можешь вывать, как CMyMother****ingClass::MyMother****ingStaticFunction(); - a если нет объекта - тогда нет виртуальной таблицы.
понимаю, но статическая имеет два способя вызова - через имя класса и через объект. во втором случает конечно объект ей не передается, но компилятор мог бы использовать его для доступа к таблице. ну а в первом вызывать как есть
Reply With Quote
Old 12.03.2004, 12:19   #9
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
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;

вот и все.
Reply With Quote
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
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

это конечно решение, но не такое красивое, как виртуальная статическая функция. а если красота - субъективный аргумент, то вот и объективный: написание дополнительной функции и передача параметра в статическую функцию
Reply With Quote
Old 12.03.2004, 14:33   #11
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

могу красивее: прицепи к проекту boost.lambda там есть функтор bind, который просто будет вызывать эту фунцкию и код будет таким
PHP Code:
///...
std::for_each(vec.begin(), vec.end(), boost::lambda::bind(CBase::VirtualProcessing_1));
///.... 
Красиво, элегантно, эстетично.
Reply With Quote
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
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

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

Last edited by Aram Hambardzumyan; 13.03.2004 at 08:11.
Reply With Quote
Old 12.03.2004, 20:21   #13
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Я сказал выше, что это неправильно. Статическая функция на то и статическая, чтобы не быть виртуальной.
Reply With Quote
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
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally Posted by Agregat
Я сказал выше, что это неправильно. Статическая функция на то и статическая, чтобы не быть виртуальной.
это неправильно только потому, что так решили при создании и стандартизации языка. а могли бы и допустить статические виртуальные функции, я не вижу этому технических помех. вопрос в том, почему не сделали?
Reply With Quote
Old 13.03.2004, 10:27   #15
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

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

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 15:37.


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