![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
то ли лыжи у меня не едут...
Какое из следующих утверждений неверно? - объектов одной иерархии классов может быть много - каждый инстанцирован определенным классом из этой иерархии => имеет собственную таблицу методов - статическая функция не получает никаких сведений об объектах, иначе она уже не статическая
какого объекта? Как она должна узнать, о каком объекте идет речь? |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
тебе - да, компилятору нет. в нестатические методы класса неявно передается указатель this, в статические он не передается, даже если ты запишешь:
он туда передан не будет, иначе функция не будет статической. |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
дык а как иначе определить, чем наш объект инстанцирован? блин, какой объект... те какой именно метод вызывать - для этого нужна таблица методов, она привязана к объекту, притом:
Это сообщение отредактировал(а) zkv - 24.8.2007, 00:13 |
||||
|
|||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Определение того, какую именно функцию нужно вызывать, происходит до вызова нужной функции (логично, не правда ли?)
Это сообщение отредактировал(а) UnrealMan - 24.8.2007, 00:14 |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
не понял ничего, ну да ладно. UnrealMan, когда ты добьешься того чтобы: ты получишь из своего статического метода обычный (нестатический) метод. Все, я выхожу из спора. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Если вдруг к С++ прикруить хороший рефлекшен и перевести его в разряд динамических языков, то все классы можно рассматривать самих как объекты с определенными свойствами. тогда статические методы можно считать простыми методами класса, где под this можно понимать сам инстанс класса(не путать с объектом).Тогда идея виртуальных статических методов преобретает разумный вид, но как уже сказал выше zkv есть много проблем. так что это всё сказки и не нужно в С++.
|
|||
|
||||
archimed7592 |
|
||||||||||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Применение прямое: виртуальный конструктор(паттерн такой). zkv, чё ты проблему раздуваешь на пустом месте. Возьмём обыкновенные виртуальные ф-ции. Когда их вызывают так:
То происходит вычисление адреса необходимой ф-ции(в зависимости от динамического типа объекта). Когда же их вызывают так:
То никакого вычисления не происходит и ф-ция вызывается вполне определённая на этапе компиляции(на основе статического типа объекта). Компилятору всё ясно в данном случае? Отлично, продолжим... Аналогично для статических виртуальных ф-ций. Когда вызывают так:
То вызывается конкретная ф-ция, известная на этапе компиляции. Когда вызывают так:
То на основе динамического типа объекта вызывается необходимая ф-ция. Замечу, что такое нововведение даже не является breaking changes и может быть совершенно безболезненно включено в Стандарт. Думаю, там понадобится изменить только лишь пару строчек ![]() Добавлено через 4 минуты и 35 секунд
Нет, ты получишь обыкновенный статический метод, который можно будет точно так же, как и раньше вызывать без объекта, но если у тебя есть объект и ты хочешь произвести виртуальный вызов, то почему бы не дать возможность сделать это? Ну разрастётся немного таблица виртуальных ф-ций... ну не страшно. -------------------- 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 |
||||||||||||
|
|||||||||||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
а ни чё ![]() хотел более или менее аргументированный ответ получить, а не просто "А вот..." Думаю над твоим ответом: пока не понимаю, чем в этом случае может не удовлетворить нестатический метод. Нельзя будет вызвать без создания объекта. Виртуальный конструктор говоришь? Посмотрим. Продолжаю размышлять... |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Главное и ИМХО единственное применение. Впрочем стоящее. Кстати, прикол в том, что в Дельфи это есть ![]() |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Угу, и в каждом холиваре они противопоставляют свои виртуальные конструкторы против шаблонов ![]() -------------------- 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 |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Может я ошибаюсь, но, по-моему, статический виртуальные функции и виртуальные конструкторы не сложно реализовать (синтаксис только для виртуальных конструкторов надо придумать
![]() ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |