Armenian Knowledge Base  

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

Reply
 
LinkBack Thread Tools
Old 13.03.2004, 10:55   #16
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
чтобы была виртуальной требуется this. если же она статическая - то получается разное поведение когда она вызывается, как CMyClass::Func() и CBase->Func()
что подразумевается под вторым вызовом - вызов CBase::Func() или pBase->Func()?
Reply With Quote
Old 13.03.2004, 20:49   #17
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

pBase->, конечно, там опечатка
суть не меняется.
Reply With Quote
Old 14.03.2004, 09:01   #18
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
pBase->, конечно, там опечатка
суть не меняется.
ok

Quote:
если же она статическая - то получается разное поведение когда она вызывается, как CMyClass::Func() и CBase->Func()
ну да. а если я хочу, чтобы второй вызов был эквивалентен первому, я хочу иметь возможность объявить статическую функцию виртуальной. почему меня лишают этой дополнительной возможности? только ли потому, что есть обходной путь, который ты показал выше? вряд ли, потому что так же можно было бы не включать в язык поддержку механизма виртуальных функций, предоставив программеру реализовывать таблицу функций ручками - это ведь возможно даже в рамках обычного си.
Reply With Quote
Old 14.03.2004, 11:47   #19
Грустно...
 
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 14.03.2004, 14:43   #20
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
Возникает куча сложностей для реализаторов компиляторов.
Кроме того неоднозначное поведение - не должно быть в стандарте.
я не вижу неоднозначного поведения. во всех случаях все четко определяется:

Class::func() - статический вызов для класса Class, вне зависимости от его положения в иерархии;

instance.func() - статический вызов для класса, экземпляром которого является переменная instance;

pBase->func() - если func() объявлена как virtual static, то динамический вызов - через таблицу виртуальных функций (для доступа к таблице использовать pBase), иначе (если просто static) - вызвать Base::func().

pDerived->func() - Derived::func() (или ближайшая по иерархии функция)

где же неоднозначность? и в чем сложность реализации?
Reply With Quote
Old 15.03.2004, 07:06   #21
Грустно...
 
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 15.03.2004, 07:15   #22
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 15.03.2004, 12:00   #23
Грустно...
 
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 15.03.2004, 12:30   #24
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 15.03.2004, 15:54   #25
Грустно...
 
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 15.03.2004, 17:05   #26
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 15.03.2004, 20:10   #27
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Опять же, без информации о классе, а именно без this - а - мы динамически тип определить не можем. То, что сделал я - у меня в каждый данный объект существовал. На самом деле, я мог просто вызывать эту функцию
Reply With Quote
Old 22.03.2004, 20:33   #28
Бакалавр
 
Join Date: 03 2002
Location: Detroit, MI, USA
Posts: 482
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

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

Одним словом: понять почему статическая функция не может быть виртуальной проще если думать о ней (статической функции) как о об обычной С-функции.
Арам, представь, будто статическая функция - C-функция, обявленная внутри namespace (класс и есть namespace).

Удачи!
Reply With Quote
Old 23.03.2004, 06:04   #29
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 Tumanyan
Дааа... Перечитал трэд и...

Одним словом: понять почему статическая функция не может быть виртуальной проще если думать о ней (статической функции) как о об обычной С-функции.
Арам, представь, будто статическая функция - C-функция, обявленная внутри namespace (класс и есть namespace).

Удачи!
технически она может быть виртуальной. мне не понятно, из каких идеологических соображений ее не сделали такой. я же могу в языке си завести массив указателей на функции
Reply With Quote
Old 23.03.2004, 14:24   #30
Бакалавр
 
Join Date: 03 2002
Location: Detroit, MI, USA
Posts: 482
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally Posted by Aram Hambardzumyan
технически она может быть виртуальной. мне не понятно, из каких идеологических соображений ее не сделали такой. я же могу в языке си завести массив указателей на функции
Несовсем. Есть технические, скорее даже, принципиальные ограничения, и вот какие:
В случае вызова без экземпляра класса, функция имеет сигнатуру:

return_type foo(type 1 arg1, type 2, arg2, .....);

При вызове через экземпляр есть 2 нюанса:

1. Вызов функции будет закодирован несколько иначе (обращение к виртуальной таблице. Косвенный вызов)

2. Сигнатура функции:

return_type foo(ClassType* instance_ptr, type1 arg1,.....);

Т.е., даже технически, получаются 2 разные функции (или перегрузка функции, в данном случае это - неважно).
С точки же зрения ООП, не выполняется одно из условий полиморфизма: единая для всех случаев сигнатура (единый метод вызова).

Удачи!
Reply With Quote
Sponsored Links
Reply

Thread Tools


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

All times are GMT. The time now is 05:20.


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