Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> static virtual function 
:(
    Опции темы
zkv
Дата 23.8.2007, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



то ли лыжи у меня не едут... 
Какое из следующих утверждений неверно?
 - объектов одной иерархии классов может быть много
 - каждый инстанцирован определенным классом из этой иерархии => имеет собственную таблицу методов
 - статическая функция не получает никаких сведений об объектах, иначе она уже не статическая
Цитата(UnrealMan @  23.8.2007,  23:40 Найти цитируемый пост)
В зависимости от динамического типа объекта могла бы вызываться нужная функция и всё.

какого объекта? Как она должна узнать, о каком объекте идет речь?
PM MAIL   Вверх
UnrealMan
Дата 23.8.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(zkv @  23.8.2007,  23:53 Найти цитируемый пост)
какого объекта?

по-моему, из приведённых мной примеров это вполне ясно.
PM MAIL   Вверх
zkv
Дата 24.8.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(UnrealMan @  23.8.2007,  23:59 Найти цитируемый пост)
по-моему, из приведённых мной примеров это вполне ясно. 

тебе - да, компилятору нет. 
в нестатические методы класса неявно передается указатель this, в статические он не передается, даже если ты запишешь:
Код

obj.StaticMethod()

он туда передан не будет, иначе функция не будет статической.
PM MAIL   Вверх
UnrealMan
Дата 24.8.2007, 00:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(zkv @  24.8.2007,  00:04 Найти цитируемый пост)
тебе - да, компилятору нет. 

Можно сделать, чтоб было ясно и компилятору.
 
Цитата(zkv @  24.8.2007,  00:04 Найти цитируемый пост)
в нестатические методы класса неявно передается указатель this, в статические он не передается

Да какая вообще разница, передаётся указатель в функцию или не передаётся? smile:
PM MAIL   Вверх
zkv
Дата 24.8.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(UnrealMan @  24.8.2007,  00:07 Найти цитируемый пост)
Да какая вообще разница, передаётся указатель в функцию или не передаётся?

дык а как иначе определить, чем наш объект инстанцирован? 
блин, какой объект... те какой именно метод вызывать - для этого нужна таблица методов, она привязана к объекту, притом: 
Цитата(zkv @  23.8.2007,  23:53 Найти цитируемый пост)
- каждый инстанцирован определенным классом из этой иерархии => имеет собственную таблицу методов



Это сообщение отредактировал(а) zkv - 24.8.2007, 00:13
PM MAIL   Вверх
UnrealMan
Дата 24.8.2007, 00:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Определение того, какую именно функцию нужно вызывать, происходит до вызова нужной функции (логично, не правда ли?)

Это сообщение отредактировал(а) UnrealMan - 24.8.2007, 00:14
PM MAIL   Вверх
zkv
Дата 24.8.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(UnrealMan @  24.8.2007,  00:13 Найти цитируемый пост)
Определение того, какую именно функцию нужно вызывать, происходит до вызова нужной функции (логично, не правда ли?)

не понял ничего, ну да ладно.

UnrealMan, когда ты добьешься того чтобы:
Цитата(UnrealMan @  24.8.2007,  00:07 Найти цитируемый пост)
Можно сделать, чтоб было ясно и компилятору.

ты получишь из своего статического метода обычный (нестатический) метод. 
Все, я выхожу из спора.
PM MAIL   Вверх
Daevaorn
Дата 24.8.2007, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Если вдруг к С++ прикруить хороший рефлекшен и перевести его в разряд динамических языков, то все классы можно рассматривать самих  как объекты с определенными свойствами. тогда статические методы можно считать простыми методами класса, где под this можно понимать сам инстанс класса(не путать с объектом).Тогда идея виртуальных статических методов преобретает разумный вид, но как уже сказал выше zkv есть много проблем. так что это всё сказки и не нужно в С++.
PM MAIL WWW   Вверх
archimed7592
Дата 24.8.2007, 01:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Void @  23.8.2007,  23:34 Найти цитируемый пост)
Но я не могу придумать ни одного практического применения такому варианту.

Применение прямое: виртуальный конструктор(паттерн такой).

zkv, чё ты проблему раздуваешь на пустом месте.
Возьмём обыкновенные виртуальные ф-ции.
Когда их вызывают так:
Код
obj.f();
/*this->*/f();

То происходит вычисление адреса необходимой ф-ции(в зависимости от динамического типа объекта).
Когда же их вызывают так:
Код
obj.MyClass::f();
/*this->*/MyClass::f();

То никакого вычисления не происходит и ф-ция вызывается вполне определённая на этапе компиляции(на основе статического типа объекта).

Компилятору всё ясно в данном случае? Отлично, продолжим...

Аналогично для статических виртуальных ф-ций.
Когда вызывают так:
Код
MyClass::sf();

То вызывается конкретная ф-ция, известная на этапе компиляции.
Когда вызывают так:
Код
obj.sf();

То на основе динамического типа объекта вызывается необходимая ф-ция.


Замечу, что такое нововведение даже не является breaking changes и может быть совершенно безболезненно включено в Стандарт. Думаю, там понадобится изменить только лишь пару строчек smile.

Добавлено через 4 минуты и 35 секунд
Цитата(zkv @  24.8.2007,  00:18 Найти цитируемый пост)
ты получишь из своего статического метода обычный (нестатический) метод. 

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
zkv
Дата 24.8.2007, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(archimed7592 @  24.8.2007,  01:17 Найти цитируемый пост)
zkv, чё ты проблему раздуваешь на пустом месте.

а ни чё  smile 
хотел более или менее аргументированный ответ получить, а не просто "А вот..."

Думаю над твоим ответом:
Цитата(archimed7592 @  24.8.2007,  01:17 Найти цитируемый пост)
Нет, ты получишь обыкновенный статический метод, который можно будет точно так же, как и раньше вызывать без объекта, но если у тебя есть объект и ты хочешь произвести виртуальный вызов, то почему бы не дать возможность сделать это?

пока не понимаю, чем в этом случае может не удовлетворить нестатический метод. 
Нельзя будет вызвать без создания объекта. Виртуальный конструктор говоришь? Посмотрим.
Продолжаю размышлять...
PM MAIL   Вверх
Любитель
Дата 23.9.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(archimed7592 @  24.8.2007,  01:17 Найти цитируемый пост)
виртуальный конструктор

Главное и ИМХО единственное применение. Впрочем стоящее. Кстати, прикол в том, что в Дельфи это есть smile И виртуальные конструкторы есть в чистом виде. И виртуальные статические методы (называемые класс-методами).


--------------------
PM MAIL ICQ Skype   Вверх
archimed7592
  Дата 23.9.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Любитель @  23.9.2007,  17:27 Найти цитируемый пост)
Кстати, прикол в том, что в Дельфи это есть smile

Угу, и в каждом холиваре они противопоставляют свои виртуальные конструкторы против шаблонов smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Любитель
Дата 23.9.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Может я ошибаюсь, но, по-моему, статический виртуальные функции и виртуальные конструкторы не сложно реализовать (синтаксис только для виртуальных конструкторов надо придумать smile ). Тем более, в принципе, последние заменимы первым, правда идеологически не идеально выглядит smile А вот реализация шаблонов посложней будет... ИМХО, правда.


--------------------
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0909 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.