Объясните механизм выбора нужного метода? с++
Возник такой диалог с преподавателем
-П: Вопрос: как во время вызова выбирается нужный метод? Почему по одной строчке происходят разные действия?
-Я: Нужный метод вызывается в зависимости от типа объекта для которого вызван этот метод.
-П: Как добраться до нужного метода по этому типу, добраться, значит получить его адрес, по адресу останется только перейти. t->show(); как по этой строчке получить адрес метода? Причем строчка одна, а методы разные.
Я не понимаю, чего от меня хотят услышать :с
Ответы (2 шт):
Была такая книжка (вышла в далеком 1996 году): Тэд Фейсон "Объектно-ориентированное программирование на Borland C++ 4.5". У меня было четвертое издание. Там в главе 5 (страница 150 и далее) подробно объясняется, как устроены таблицы виртуальных методов.
Другой вариант - написать пример иерархии из двух классов, вызвать виртуальный метод по ссылке на базовый класс и поглядеть, во что разворачивает этот вызов компилятор. Только оптимизацию надо отключить, чтобы было более наглядно.
Я ответила так, может кому пригодится. Ответ засчитали.
Имя метода, использованное в программе, связывается с адресом входа конкретного метода во время исполнения программы. Выполняется с использованием таблицы виртуальных методов, которая создаётся компилятором для каждого класса. В элементах таблицы находятся указатели на реализации виртуальных методов, соответствующие данному классу. Таким образом, для адреса каждого виртуального метода имеется одно, фиксированное смещение в таблице виртуальных методов. Каждый объект имеет техническое поле, которое при создании объекта инициализируется указателем на таблицу виртуальных методов своего класса. Для вызова виртуального метода из объекта берётся указатель на соответствующую таблицу виртуальных методов, а из неё, по известному фиксированному смещению, — указатель на реализацию метода, используемого для данного класса.