в том случае, где метод привязан к типу объекта, ответом будет «ну и чо? ты щас жопу с пальцем зачем сравнил?». допустим, что в твоем мире метод привязан к типу получателя. в любом случае в конце диспетчеризации вызовется метод, привязанный к типу объекта. ты путаешь вход и выход данные диспетчера? зачем сравниваешь (или не сравниваешь, кто тебя разберет) методы (выход) и сообщения (вход)?
итого: либо предлагаю вернуться к изначальному вопросу, либо сужаю и повторяю вопрос для этого твоего частного случая «метод привязан к типу объекта (классу)»: в любом случае есть диспетчер, получающий на входе сообщение и возвращающий на выходе метод, привязанный к типу получателя, так чем тебе подсмотр указателя метода в таблице не обработка сообщения? выбирай.
In computer science, dynamic dispatch is the process of selecting which implementation of a polymorphic operation (method or function) to call at run time.
Ты ведь без труда найдёшь принципиальное несоответствие виртуальных методов крестов этому определению?
Минутка искромётного юмора: кто, кстати, говорил, что нельзя дёрнуть произвольный метод указателя на любую фигню? Можно:
#include <iostream>
using namespace std;
struct A {
virtual void foo() {
cout<<"A::foo\n";
}
virtual void bar() {
cout<<"A::bar\n";
}
};
struct B {
virtual void foo() {
cout<<"B::foo\n";
}
virtual void bar() {
cout<<"B::bar\n";
}
};
int main(int, char**) {
A a;
cout<<"Calling foo:\n";
reinterpret_cast<B*>(&a)->foo();
cout<<"Ok\n";
}
...правда не всегда:
#include <iostream>
using namespace std;
struct A {
virtual void foo() {
cout<<"A::foo\n";
}
virtual void bar() {
cout<<"A::bar\n";
}
};
// The only difference is in the definition order
struct B {
virtual void bar() {
cout<<"B::bar\n";
}
virtual void foo() {
cout<<"B::foo\n";
}
};
int main(int, char**) {
A a;
cout<<"Calling foo:\n";
reinterpret_cast<B*>(&a)->foo();
cout<<"Too bad\n";
}
и как (в твоем мире) это запрещает считатьь это обработкой сообщений ты нам объяснишь наконец?
первая часть поста вообще шикарна. ты пытался ответить на первую половину моего поста? попробуй еще раз. цитируй те части, где есть вопросительный знак, а после них пиши утверждения, отвечающие на них. у тебя же получилось: «что за хрень ты спорол?» - «именно».
и как (в твоем мире) это запрещает считатьь это обработкой сообщений ты нам объяснишь наконец?
ты можешь считать это чем угодно, разрешаю. я предпочитаю называть вещи своими именами. механизм посылки и обработки сообщений достаточно сильно отличается от крестовых виртуальных методов, чтобы увидеть разницу. если ты ее не видишь - это твои проблемы.
первая часть поста вообще шикарна. ты пытался ответить на первую половину моего поста?
я просто согласился с твоей репликой. что не так?
отвечаю на вопрос:
зачем сравниваешь (или не сравниваешь, кто тебя разберет) методы (выход) и сообщения (вход)?
я сравниваю не методы и сообщения, а принцип их вызова (отправки), диспетчеризации, и обработки. они разные. но ты можешь считать их одинаковыми, не вижу в этом проблемы.
читать не умеешь ты. я ни разу не утверждал, что в крестах нельзя вызвать методы одного класса через vtbl другого класса, даже если классы вообще ни разу не связаны. можно например в B переименовать foo в goo, дернуть его, и вызовется foo из A. и хрен с ним. но это _вообще_ никакого отношения не имеет к моему исходному вопросу, от которого fmdw уворачивается как может, хотя ответ очевиден, что кресты так тупо не могут, и это и есть пример отличия между message passing и virtual methods.
1) fmdw, как ни странно, ответил на тот твой вопрос. именно на твой исходный вопрос. то, что тебе это не нравится и ты безосновательно называешь это «но это _вообще_ никакого отношения не имеет к моему исходному вопросу» ничего не меняет.
2) ты не ответил на мой вопрос. «механизм посылки и обработки сообщений достаточно сильно отличается от крестовых виртуальных методов, чтобы увидеть разницу. если ты ее не видишь - это твои проблемы.» — не ответ, т. к. ты уже постов 5 не можешь показать, где ее узрел ты.
3) ответ на оригинальный вопрос (вопрос ТС) нашли еще теоретики, разговаривавшие только кванторами, и ответ с твоим не совпадает. видимо потому что...
4) ... на крестах мир не сошелся, но, как совершенно правильно заметил fmdw, твои хаотичные знания, полученные явно после первого твоего комментария в этом треде, должен систематизировать второй семестр. а кругозор расширять — это уже потом.
в моем исходном вопросе говорилось, что у нас есть указатель с типом void *. когда он отмазался, я предложил ему пустой baseclass. такой ответ — да, это натуральный чит, я с тем же успехом могу в крестах достать указатель из vtbl, напрямую из памяти, кастануть его к нужной сигнатуре, и вызвать. но так на вопросы отвечают только шланги.
не ответ, т. к. ты уже постов 5 не можешь показать, где ее узрел ты.
я несколько раз написал, где. не можешь читать - давай дасвидания.
и ответ с твоим не совпадает
давай ссылку на ответ теоретиков. будет интересно просветиться.
на крестах мир не сошелся, но, как совершенно правильно заметил fmdw, твои хаотичные знания, полученные явно после первого твоего комментария в этом треде, должен систематизировать второй семестр. а кругозор расширять — это уже потом.
Мой оппонент? Да какой-то... о господи, боже, боже!.. Это тот самый, который написал для Linux аудиоплеер! А я еще посмел уличать его в том, что он не привел аргумента весомее «они разные»? Посыпаю голову пеплом, его огромный авторитет конечно же с лихвой перевешивает его умение вести дискуссии!
То, что кресты на стадии компиляции превращают имена в индексы — частная особенность крестов. Она не имеет к вопросу ОПа ни малейшего отношения. Там с примерно тем же успехом могли быть словари, хэштаблицы, whatever. То, что ты эту особенность выдаёшь за некую принципиальную разницу между методами и сообщениями — признак дегенерации. Как и любая попытка искать разницу между этими подходами на стороне отправителя. Потому что, в третий раз повторяю, *разница между сообщениями и методами состоит в том, как их обрабатывает получатель.*
Это тот самый, который написал для Linux аудиоплеер!
Может плеер и не ядро, но выпады про «хаотичные знания» и «второй семестр» можно придержать, зная, что человек знаком с программированием по крайней мере на сях/плюсах совсем не понаслышке, не считаешь?
In computer science, dynamic dispatch is the process of selecting which implementation of a polymorphic operation (method or function) to call at run time.
Ты ведь без труда найдёшь принципиальное несоответствие виртуальных методов крестов этому определению?
В крестах нет никакого «process of selecting» при вызове метода. Мы обращаемся по фиксированному смещению в объекте для обращения к vmt, а там, в свою очередь, по фиксированному смещению получаем адрес функции, которую и вызываем. Вся магия заключается в том, что компилятор уже проставил адреса нужных функций и обеспечил установку для каждого объекта нужного адреса vmt. В динамике ничего не ищется(сравни с objective-c).
Все мирно беседовали про вопрос ТС, писали милые глупости, и тут он пишет (даже не удосужившись предупредить, что его уютный мирок ограничен крестами) вот это:
разница в том, что вызов метода — это конкретный указатель на код, который типично резолвится при компиляции. а сообщения диспетчеризуются в рантайме
По ходу обсуждения его замечания становятся несколько лучше, но медленно, что вполне допускает, что знания по теме, в которую зачем-то зашел, он черпает, гугля на ходу. К концу второго дня он так и не разобрался, хотя все поддались на провокацию, снизошли до убогих крестов, решили ему задачку и 10 раз спросили, какие такие отличия он там увидел.
Я не утверждаю, что он не знаком с практически полезными аспектами программирования на плюсах, упаси боже. Но в философскую тему не о плюсах он мог бы и не лезть, а помня побольше из второго семестра — не выглядеть глупо, не считаешь?
Отвечу за него — да, он откажется признать разыменование по известному смещению поиском, и, также, по неизвестным мне соображениям, «process of selecting»'ом.. Что поделать — не знаю. Может ты придумаешь.
Мне вообще непонятно, зачем ты придрался к фразе «process of selecting». В приведённом определении нет ни слова о том, что должен представлять из себя этот процесс выбора.
В крестах есть множество реализаций одного вызова (полиморфизм). Есть процесс выбора нужной реализации в рантайме. То, что он оптимизируется до разыменовывания — ну так прекрасно.
Я придрался в контексте темы. На мой взгляд, в ООП метод - это обработчик сообщения. vmt - можно с натяжкой считать таблицей соответствия сообщение -> метод, но с учетом того, что она захардкожена. В общем же случае в крестах нет сообщений, есть только методы. И термин «виртуальный метод»/«виртуальная функция член» - чисто крестовая терминология, не имеющая прямого отношения к ООП, лишь к его частной реализации.
Вот в objective-c, для сравнения, мы посылаем сообщение и рантайм ищет для него метод по определенному алгоритму.
В рантайме там будет просто вызов по указателю. vmt создается статически для каждого класса и статически же описывается ее установка в коде конструирования объекта.
В рантайме там будет просто вызов по указателю. vmt создается статически для каждого класса и статически же описывается ее установка в коде конструирования объекта.
Но именно в рантайме исходя из vmt и будет сформирован нужный указатель.