Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, Perseus, Вы писали:
P>>Вот кусок примера, который я приводил выше:
P>>Interface* object1 = new A();
P>>Interface* object2 = new B();
P>>foo((A)object1);
P>>foo((B)object2);
P>>Какой тип у object1? Interface! Какой же экзепляр соответсвует object1 на этапе выполнения? A! (в смысле экземпляр класса А). Компилятор подбирает сответствующую сигнатуру по ТИПУ объекта. Твоя проблема в том, что ты не понимаешь, что foo(A* a) и foo(B* a) — совершенно разные функции, и поиск нужной сигнатуры при вызове ничем не отличается от вызова любой другой ф-ции. Тебя смущает одинаковые название ТЕЛА этих ф-ций. А между прочим, компилятору реально пофиг на тело, он отличает ф-ции только по сигнатуре. Предположим, мы назвали наши ф-ции по-разному
К>По-моему ты запутался, Interface* — это тип указателя/ссылки, когда как у объекта, на который этот указатель/ссылка указывает, тип будет A.
Можно сказать и так. Неужели неочевидно равнозначность сказанного мной и вот этого утверждения. котрое представляет собой простую переформулировку? Тип объекта = типу ссылки. Само собой, РЕАЛЬНЫЙ тип объекта не имеет с эти ничего общего.
К>В традиционных языках нет диспетчеризации в рантайме по параметрам функции (в отличие, от лиспа, к примеру) и единственный метод — vtbl, но есть перегрузка, т.е. диспетчеризация времени компиляции, а там известен лишь тип ссылок, а не "живых" объектов. Ну а vtbl есть лишь один метод перегрузки, причём самый, имхо, простой, понятный, ну и эффективный.
Само собой. Что ты хотел этим сказать?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>