Re[4]: virtual static и static virtual
От: e-Xecutor Россия  
Дата: 18.07.03 06:54
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, MByte, Вы писали:


MB>>Здравствуйте, MaximE, Вы писали:


ME>>>Здравствуйте, MByte, Вы писали:


MB>>>>Буду очень признателен за просвещение или ссылку где можно это все почерпнуть.


ME>>>Может стоит купить хорошую книжку по c++, например Страуструпа?


MB>>У меня есть Страуструп, но там я нашел только описание virtual и static.Их комбинации нигде не видел, тем более с примерами.Может плохо искал.Искал в интернете.Результат ноль.Все тыкают куда угодно, говорят мол есть такое, а рассказать толком, да еще и примеры привести никто не может.Все только умничать и умеют.Устал искать уже, вот и решил закинуть вопрос на форум.


B>Такая комбинация невозможна. Для работы виртуальной функции необходим доступ к таблице виртуальных функций класса. Этот доступ возможен только через указатель на эту таблицу (по крайней мере во многих реализациях это так), а указатель содержится в каждом объекте. static же функция ни с какими объектами дела не имеет, а посему не имеет возможности добраться до таблицы.


Вот если бы gcc-шный typeof был бы в стандарте,
и был полноценно реализован (с учётом rtti), то
можно было бы сказать, что у виртуальных классов статические функции виртуальны

class A{
public:
virtual void stub(){}
static void test(){}
};
class B:public A{
public:
virtual void stub(){}
static void test(){}
};
int main()
{
  B b;
  A* a=&b;
  typeof(*a)::test();
}


gcc 3.2.3 это даже компиляет
но оно не работает
Re[4]: Перпендикулярные свойства
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.07.03 08:02
Оценка: 1 (1) -1
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Их комбинация невозможна

Ну почему же невозможна?! static означает, что у метода нет первого параметра this (ну или метод не с thiscall calling convention). virtual означает, что доступ к такой функции может быть через vtable.

По-моему, это перпендикулярные свойства — одно другому не мешает. И вполне могут быть представлены.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: virtual static и static virtual
От: MaximE Великобритания  
Дата: 18.07.03 08:33
Оценка: -1
Здравствуйте, folk, Вы писали:

F>Здравствуйте, Lorenzo_LAMAS, Вы писали:


L_L>>Их комбинация невозможна (и не нужна)


F>А по-моему пригодилась бы.

F>Пусть внутри функции this не нужен, но вызов конкретной переопределенной реализации должен осуществляться на основе динамического типа экземпляра (если экземпляра нет, то явной квалификацией класса).

Как раз для этой цели используют идиому double dispatch.
Re[6]: virtual static и static virtual
От: LCR Россия lj://_lcr_
Дата: 18.07.03 08:41
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Как раз для этой цели используют идиому double dispatch.


MaximE, можно по-подробнее. Что это за идиома?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[5]: Перпендикулярные свойства
От: Lorenzo_LAMAS  
Дата: 18.07.03 08:49
Оценка:

10.3/7
... Nor can a virtual function be a static member, since a virtual function call relies on a specific object for determining wich function to invoke...

Of course, the code must be complete enough to compile and link.
Re[5]: Перпендикулярные свойства
От: Вадим Никулин Россия Здесь
Дата: 18.07.03 10:09
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Lorenzo_LAMAS, Вы писали:


Vi2>

L_L>>Их комбинация невозможна

Vi2>Ну почему же невозможна?! static означает, что у метода нет первого параметра this (ну или метод не с thiscall calling convention). virtual означает, что доступ к такой функции может быть через vtable.
Vi2>По-моему, это перпендикулярные свойства — одно другому не мешает. И вполне могут быть представлены.

И где же ты возьмешь vtable без this?
Re[7]: virtual static и static virtual
От: Awaken Украина  
Дата: 18.07.03 10:11
Оценка:
Здравствуйте, LCR, Вы писали:

LCR>Здравствуйте, MaximE, Вы писали:


ME>>Как раз для этой цели используют идиому double dispatch.


LCR>MaximE, можно по-подробнее. Что это за идиома?


см.в книгах Мейерса и Александреску.
Re[6]: Перпендикулярные свойства
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.07.03 12:02
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:

ВН>И где же ты возьмешь vtable без this?

Причем здесь vtable и this? vtable нужен при вызове метода через указатель pObj->Func(); Внутри самой функции this может и не требоваться если стоит static.

Что не знаете, что static функцию можно звать и так
CSomeClass pObj = ...;
pObj->SomeFunc();

и так
CSomeClass::SomeFunc();

Точно также виртуальную функцию можно звать. По крайней мере на вид они похожи. Единственное отличие — во втором случае требуется объект, так это нужно для thiscall вызова.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[7]: Перпендикулярные свойства
От: Lorenzo_LAMAS  
Дата: 18.07.03 12:05
Оценка:
Vi2>Точно также виртуальную функцию можно звать. По крайней мере на вид они похожи. Единственное отличие — во втором случае требуется объект, так это нужно для thiscall вызова.

Это нужно чтобы выбрать правильную версию виртуальной функции.
Of course, the code must be complete enough to compile and link.
Re[8]: Перпендикулярные свойства
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.07.03 12:13
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Это нужно чтобы выбрать правильную версию виртуальной функции.

Версия виртуальной функции не зависит от static (или того помещается ли адрес первым аргументом или нет).

Вернемся к предыдущим примерам
CSomeClass pObj = ...;
pObj -> SomeFunc(...);
и так
pObj -> CSomeClass::SomeFunc(...);

Что можно сказать о таких функциях? Да ничего. Они могут быть как виртуальными/невиртуальными, так и татеческими/нестатическими. Поэтому вполне допустима виртуальная статическая функция, просто при ее вызове не передается первый параметр. Хотя вызов может осуществляться через vtable.

То, что это не реализовано, это-то ясно.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[9]: Перпендикулярные свойства
От: Lorenzo_LAMAS  
Дата: 18.07.03 12:25
Оценка:
Что то мы видать о разном говорим.

Я о том, что для выбора нужной функции нужен объект — он содержит вптр, который указывает на втбл, в которой "адрес нужной функции". Т.е. о таком
obj->some();
[pseudo code]
obj->__vptr[someindex]();
[/pseudo code]
Of course, the code must be complete enough to compile and link.
Re[10]: Перпендикулярные свойства
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.07.03 12:29
Оценка: 4 (1)
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Я о том, что для выбора нужной функции нужен объект — он содержит вптр, который указывает на втбл, в которой "адрес нужной функции". Т.е. о таком

Выбор адреса функции и вызов функции с дополнительным параметром — это изначально разные вещи. Можно выбрать функцию из vtable, но не передавать туда this. Смысл? Не знаю.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[11]: Перпендикулярные свойства
От: Lorenzo_LAMAS  
Дата: 18.07.03 12:35
Оценка:
Хорошо, я понял. Ты к тому, чтоб так же как и нестатические вирт. функции, по такому же принципу и статические вызывать?
Of course, the code must be complete enough to compile and link.
Re[12]: Перпендикулярные свойства
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.07.03 13:07
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>...Ты к тому, чтоб так же как и нестатические вирт. функции, по такому же принципу и статические вызывать?

Так они и так так вызываются. Просто не реализовано и запрещено.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: Перпендикулярные свойства
От: Павел Кузнецов  
Дата: 18.07.03 13:13
Оценка: +1
Здравствуйте, Vi2, Вы писали:

V> Ну почему же невозможна?! static означает, что у метода нет первого

V> параметра this (ну или метод не с thiscall calling convention).
V> virtual означает, что доступ к такой функции может быть через vtable.

static означает, что функцию-член можно вызывать, не имея объекта соответствующего
класса. Виртуальный вызов подобным образом сделать принципиально невозможно.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Перпендикулярные свойства
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.07.03 13:21
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>static означает, что функцию-член можно вызывать, не имея объекта соответствующего
ПК>класса. Виртуальный вызов подобным образом сделать принципиально невозможно.

Виртуальный вызов нельзя сделать при полном описании имени, даже с объектом. Что из этого следует? Ничего.
pObj -> CObjClass::SomeVirtMethod(...);

Чем это отличается от
pObj -> CObjClass::SomeStaticMethod(...);

А не имея объекта, невозможно не только вызвать виртуальный метод, но и просто нестатический метод. Тут виртуальность как бы сбоку. Но если есть объект, то и виртуальный вызов можно сделать, и статический.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: Перпендикулярные свойства
От: Аноним  
Дата: 18.07.03 13:25
Оценка: +2
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>static означает, что функцию-член можно вызывать, не имея объекта соответствующего

ПК>класса. Виртуальный вызов подобным образом сделать принципиально невозможно.

По-моему, Vi2 имел в виду (концептуально, а не применительно к Си++) такую трактовку статического метода: метод, чье действие не зависит от состояния конкретного объекта.

Например, в те времена, когда не было typeid и иже с ним, многие библиотеки содержали самодельные средства RTTI. Классы содержали метод вроде virtual RuntimeClass* GetType() const. Такому методу безразлично состояние (но не динамический тип) конкретного объекта, к которому он применен, и он "статический" в этом смысле.
Re[9]: Перпендикулярные свойства
От: LaptevVV Россия  
Дата: 18.07.03 13:33
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Версия виртуальной функции не зависит от static (или того помещается ли адрес первым аргументом или нет).


Vi2>Вернемся к предыдущим примерам

Vi2>
Vi2>CSomeClass pObj = ...;
Vi2>pObj -> SomeFunc(...);
Vi2>и так
Vi2>pObj -> CSomeClass::SomeFunc(...);
Vi2>

Vi2>Что можно сказать о таких функциях? Да ничего. Они могут быть как виртуальными/невиртуальными, так и татеческими/нестатическими. Поэтому вполне допустима виртуальная статическая функция, просто при ее вызове не передается первый параметр. Хотя вызов может осуществляться через vtable.

Vi2>То, что это не реализовано, это-то ясно.


Прощу прощения, но виртуальность-нестатичность или статичность-невиртуальность — это принципиальный вопрос семантики языка, а не доступа-реализации к функции.
Статическая функция — это функция класса. Она принципиально в одном экземпляре.
А виртуальная функция — это функция объекта. Функция класса СУЩЕСТВУЕТ ДО объявления объекта. А виртуальная функция (ну, хорошо, vtable) — только после объявления объекта. Как виртуальная функция может быть статической, если их столько, сколько объектов???????
Она потому и названа виртуальной, что меняется от объекта к объекту.
И как тогда Вы будете понимать такой термин: СТАТИЧЕСКАЯ ЧИСТАЯ ВИРТУАЛЬНАЯ функция?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[7]: Перпендикулярные свойства
От: Павел Кузнецов  
Дата: 18.07.03 14:19
Оценка: 1 (1)
Здравствуйте, Vi2, Вы писали:

ПК>> static означает, что функцию-член можно вызывать, не имея объекта

ПК>> соответствующего класса. Виртуальный вызов подобным образом сделать
ПК>> принципиально невозможно.

V> Виртуальный вызов нельзя сделать при полном описании имени, даже с

V> объектом. Что из этого следует? Ничего.

Это немного о другом. Просто, если ввести возможность указывать и virtual, и static
одновременно, как ты предлагаешь, получившиеся функции перестанут быть статическими
(т.к. их нельзя будет вызывать без объекта), не приобретя ничего по сравнению с обычными
виртуальными, кроме того, что this в них доступен не будет.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[10]: Перпендикулярные свойства
От: Артур Россия  
Дата: 19.07.03 13:45
Оценка:
Здравствуйте, LaptevVV, Вы писали:



LVV>Прощу прощения, но виртуальность-нестатичность или статичность-невиртуальность — это принципиальный вопрос семантики языка, а не доступа-реализации к функции.

LVV>Статическая функция — это функция класса. Она принципиально в одном экземпляре.
LVV>А виртуальная функция — это функция объекта. Функция класса СУЩЕСТВУЕТ ДО объявления объекта. А виртуальная функция (ну, хорошо, vtable) — только после объявления объекта. Как виртуальная функция может быть статической, если их столько, сколько объектов???????
Почему это vtable существует только после объявления объекта? Указатель на vtable заполняется при создании объекта, а сам виртуальная таблица генерируется для класса, и существует независимо от того, создавал ли ты объекты данного класса или нет. Если не ошибаюсь, виртуальная таблица существует даже для абстрактных классов, объектов которых и быть не может. Я согласен с VI2, что статичность и виртуальность скорее перпендикулярные понятия, а зависимыми они стали только благодаря реализации (vtable как член класса).
... << RSDN@Home 1.1 beta 1 >>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.