Здравствуйте, 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();
}
Ну почему же невозможна?! static означает, что у метода нет первого параметра this (ну или метод не с thiscall calling convention). virtual означает, что доступ к такой функции может быть через vtable.
По-моему, это перпендикулярные свойства — одно другому не мешает. И вполне могут быть представлены.
Здравствуйте, folk, Вы писали:
F>Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>>Их комбинация невозможна (и не нужна)
F>А по-моему пригодилась бы. F>Пусть внутри функции this не нужен, но вызов конкретной переопределенной реализации должен осуществляться на основе динамического типа экземпляра (если экземпляра нет, то явной квалификацией класса).
Как раз для этой цели используют идиому double dispatch.
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.
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, Lorenzo_LAMAS, Вы писали:
Vi2>
L_L>>Их комбинация невозможна
Vi2>Ну почему же невозможна?! static означает, что у метода нет первого параметра this (ну или метод не с thiscall calling convention). virtual означает, что доступ к такой функции может быть через vtable. Vi2>По-моему, это перпендикулярные свойства — одно другому не мешает. И вполне могут быть представлены.
Здравствуйте, LCR, Вы писали:
LCR>Здравствуйте, MaximE, Вы писали:
ME>>Как раз для этой цели используют идиому double dispatch.
LCR>MaximE, можно по-подробнее. Что это за идиома?
Причем здесь vtable и this? vtable нужен при вызове метода через указатель pObj->Func(); Внутри самой функции this может и не требоваться если стоит static.
Что не знаете, что static функцию можно звать и так
CSomeClass pObj = ...;
pObj->SomeFunc();
и так
CSomeClass::SomeFunc();
Точно также виртуальную функцию можно звать. По крайней мере на вид они похожи. Единственное отличие — во втором случае требуется объект, так это нужно для thiscall вызова.
Vi2>Точно также виртуальную функцию можно звать. По крайней мере на вид они похожи. Единственное отличие — во втором случае требуется объект, так это нужно для thiscall вызова.
Это нужно чтобы выбрать правильную версию виртуальной функции.
Of course, the code must be complete enough to compile and link.
L_L>Это нужно чтобы выбрать правильную версию виртуальной функции.
Версия виртуальной функции не зависит от static (или того помещается ли адрес первым аргументом или нет).
Вернемся к предыдущим примерам
CSomeClass pObj = ...;
pObj -> SomeFunc(...);
и так
pObj -> CSomeClass::SomeFunc(...);
Что можно сказать о таких функциях? Да ничего. Они могут быть как виртуальными/невиртуальными, так и татеческими/нестатическими. Поэтому вполне допустима виртуальная статическая функция, просто при ее вызове не передается первый параметр. Хотя вызов может осуществляться через vtable.
L_L>Я о том, что для выбора нужной функции нужен объект — он содержит вптр, который указывает на втбл, в которой "адрес нужной функции". Т.е. о таком
Выбор адреса функции и вызов функции с дополнительным параметром — это изначально разные вещи. Можно выбрать функцию из vtable, но не передавать туда this. Смысл? Не знаю.
Здравствуйте, Vi2, Вы писали:
V> Ну почему же невозможна?! static означает, что у метода нет первого V> параметра this (ну или метод не с thiscall calling convention). V> virtual означает, что доступ к такой функции может быть через vtable.
static означает, что функцию-член можно вызывать, не имея объекта соответствующего
класса. Виртуальный вызов подобным образом сделать принципиально невозможно.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
ПК>static означает, что функцию-член можно вызывать, не имея объекта соответствующего
ПК>класса. Виртуальный вызов подобным образом сделать принципиально невозможно.
Виртуальный вызов нельзя сделать при полном описании имени, даже с объектом. Что из этого следует? Ничего.
pObj -> CObjClass::SomeVirtMethod(...);
Чем это отличается от
pObj -> CObjClass::SomeStaticMethod(...);
А не имея объекта, невозможно не только вызвать виртуальный метод, но и просто нестатический метод. Тут виртуальность как бы сбоку. Но если есть объект, то и виртуальный вызов можно сделать, и статический.
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>static означает, что функцию-член можно вызывать, не имея объекта соответствующего ПК>класса. Виртуальный вызов подобным образом сделать принципиально невозможно.
По-моему, Vi2 имел в виду (концептуально, а не применительно к Си++) такую трактовку статического метода: метод, чье действие не зависит от состояния конкретного объекта.
Например, в те времена, когда не было typeid и иже с ним, многие библиотеки содержали самодельные средства RTTI. Классы содержали метод вроде virtual RuntimeClass* GetType() const. Такому методу безразлично состояние (но не динамический тип) конкретного объекта, к которому он применен, и он "статический" в этом смысле.
Здравствуйте, Vi2, Вы писали:
Vi2>Версия виртуальной функции не зависит от static (или того помещается ли адрес первым аргументом или нет).
Vi2>Вернемся к предыдущим примерам Vi2>
Vi2>Что можно сказать о таких функциях? Да ничего. Они могут быть как виртуальными/невиртуальными, так и татеческими/нестатическими. Поэтому вполне допустима виртуальная статическая функция, просто при ее вызове не передается первый параметр. Хотя вызов может осуществляться через vtable.
Vi2>То, что это не реализовано, это-то ясно.
Прощу прощения, но виртуальность-нестатичность или статичность-невиртуальность — это принципиальный вопрос семантики языка, а не доступа-реализации к функции.
Статическая функция — это функция класса. Она принципиально в одном экземпляре.
А виртуальная функция — это функция объекта. Функция класса СУЩЕСТВУЕТ ДО объявления объекта. А виртуальная функция (ну, хорошо, vtable) — только после объявления объекта. Как виртуальная функция может быть статической, если их столько, сколько объектов???????
Она потому и названа виртуальной, что меняется от объекта к объекту.
И как тогда Вы будете понимать такой термин: СТАТИЧЕСКАЯ ЧИСТАЯ ВИРТУАЛЬНАЯ функция?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Vi2, Вы писали:
ПК>> static означает, что функцию-член можно вызывать, не имея объекта ПК>> соответствующего класса. Виртуальный вызов подобным образом сделать ПК>> принципиально невозможно.
V> Виртуальный вызов нельзя сделать при полном описании имени, даже с V> объектом. Что из этого следует? Ничего.
Это немного о другом. Просто, если ввести возможность указывать и virtual, и static
одновременно, как ты предлагаешь, получившиеся функции перестанут быть статическими
(т.к. их нельзя будет вызывать без объекта), не приобретя ничего по сравнению с обычными
виртуальными, кроме того, что this в них доступен не будет.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
LVV>Прощу прощения, но виртуальность-нестатичность или статичность-невиртуальность — это принципиальный вопрос семантики языка, а не доступа-реализации к функции. LVV>Статическая функция — это функция класса. Она принципиально в одном экземпляре. LVV>А виртуальная функция — это функция объекта. Функция класса СУЩЕСТВУЕТ ДО объявления объекта. А виртуальная функция (ну, хорошо, vtable) — только после объявления объекта. Как виртуальная функция может быть статической, если их столько, сколько объектов???????
Почему это vtable существует только после объявления объекта? Указатель на vtable заполняется при создании объекта, а сам виртуальная таблица генерируется для класса, и существует независимо от того, создавал ли ты объекты данного класса или нет. Если не ошибаюсь, виртуальная таблица существует даже для абстрактных классов, объектов которых и быть не может. Я согласен с VI2, что статичность и виртуальность скорее перпендикулярные понятия, а зависимыми они стали только благодаря реализации (vtable как член класса).