|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||||||||||||||||||||||||||
Методы вызываются через указатель на объект класса; Как компилятор определяет, какой из методов надо вызвать?10.03.2013, 08:39. Показов 1944. Ответов 12
Метки нет (Все метки)
Ребята, если вникать, то вообще ничё непонятно. Вот смотрите: пусть у нас есть абстрактный класс abstr (abstr.h) и в нём определено, например 10 функций виртуальных функции. Эти функции реализованы в каком-то статическом классе stats (файлы stats.h и stats.cpp). И пусть мы вызываем например две из них в main.cpp, вот так:
Два абсолютно одинаковых набора сырцов (хотя сырцами называют исходники, но я щас говорю про *.o файлы) и два абсолютно разных экзешника! ++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++ Вы мне можете возразить- функции, которые вызовутся, определяются непосредственно во время исполнения. А вот ни фига подобного. Во время исполнения может быть определён тип статического классса, к которому будет неявно приведён указатель p- (тут, собсно, ничё нового. Но у меня для простоты один тип- stats). А вот функции, которые вызовутся, становятся известны только на этапе линковки и не позже! Хотя бы даже из того это следует, что: мы линкуем, допустим, второй пример и у нас в экзешнике оказываются ИМЕНО две нужных функции из 10-ти, foo_4 и foo_5, остальных и в помине там нет. Так как компилятор из двух совершенно одинаковых наборов символов определяет- что в этот раз надо вставить в тело экзешника код функции такой-то, а в другой раз код функции такой-то. Где он в файле main.o видит имена этих функций? И ещё раз повторю: аргумент "функции, которые необходимо вызвать, находятся через указатель p" (я, кстати, смотрел это дело в отладчике OllyDbg), неправилен. Ибо через этот указатель они могут найтись только лишь во время исполнения программы. А как мы выяснили, они к этому времени уже находятся в экзешнике. Причём только нужные функции, и никаких лишних. В общем, ступор тот ещё. Спасибо, кто откликнется. Файлы прилагаю. это исходники будут
компилить:
А тут на всякий случай АБСОЛЮТНО одинаковые файлы main.o в первом и во втором случаях
//m_01.txt 00000000 b .bss 00000000 d .data 00000000 r .eh_frame 00000000 r .eh_frame$_ZN5abstrC2Ev 00000000 r .eh_frame$_ZN5statsC1Ev 00000000 r .eh_frame$getchar 00000000 r .rdata$_ZTI5abstr 00000000 r .rdata$_ZTS5abstr 00000000 r .rdata$_ZTV5abstr 00000000 t .text 00000000 t .text$_ZN5abstrC2Ev 00000000 t .text$_ZN5statsC1Ev 00000000 t .text$getchar U _SetConsoleCP@4 U _SetConsoleOutputCP@4 00000000 T __ZN5abstrC2Ev 00000000 T __ZN5statsC1Ev 00000000 R __ZTI5abstr 00000000 R __ZTS5abstr 00000000 R __ZTV5abstr U __ZTV5stats U __ZTVN10__cxxabiv117__class_type_infoE U __ZdlPv U __Znwj U ___cxa_pure_virtual U ___main U __filbuf U __imp___iob 00000000 T _getchar 00000000 T _main +++++++++++++++++++++++++++++++++++++++= //m_45.txt 00000000 b .bss 00000000 d .data 00000000 r .eh_frame 00000000 r .eh_frame$_ZN5abstrC2Ev 00000000 r .eh_frame$_ZN5statsC1Ev 00000000 r .eh_frame$getchar 00000000 r .rdata$_ZTI5abstr 00000000 r .rdata$_ZTS5abstr 00000000 r .rdata$_ZTV5abstr 00000000 t .text 00000000 t .text$_ZN5abstrC2Ev 00000000 t .text$_ZN5statsC1Ev 00000000 t .text$getchar U _SetConsoleCP@4 U _SetConsoleOutputCP@4 00000000 T __ZN5abstrC2Ev 00000000 T __ZN5statsC1Ev 00000000 R __ZTI5abstr 00000000 R __ZTS5abstr 00000000 R __ZTV5abstr U __ZTV5stats U __ZTVN10__cxxabiv117__class_type_infoE U __ZdlPv U __Znwj U ___cxa_pure_virtual U ___main U __filbuf U __imp___iob 00000000 T _getchar 00000000 T _main Реезультаты сравнения stats.o самого с собой не выкладываю- и так понятно, он же не менялся от компиляции к компиляции, потому что не менялся stats.cpp
0
|
|||||||||||||||||||||||||||||||
| 10.03.2013, 08:39 | |
|
Ответы с готовыми решениями:
12
Явно указать какой из перегруженных методов надо вызвать
Как с помощью методов java.lang.reflect вызвать прикладные методы локального интерфейса? |
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 10.03.2013, 08:56 [ТС] | |
|
Да он так и делает. Только почему-то по этим адресам кладутся нужные функции. Как он во время ЛИНКОВКИ (иначе мы бы имели в экзешнике все функции вместо фактически задействованных) определяет, какая функция нужная, а какая нет?
0
|
|
|
|
||||||||
| 10.03.2013, 10:24 | ||||||||
|
Пример грязного использования VPTR - будет работать в MSVS, т.к. у них документировано, что VPTR располагается по нулевому смещение в объекте класса.
Добавлено через 3 минуты вот нагуглил. Добавлено через 31 минуту Поковырялся в ассемблере (в листинге для кода выше). Инициализация VPTR происходит так - сначала VPTR настраивается на таблицу для класса А (все адреса вычисляются на этапе компиляции), потом в конструкторе В (до начала выполнения самомого конструктора) VPTR переписывается на указатель на таблицу для класса В. Увидел еще одну интересную вещь - везде пишут что сначала вызывается конструктор базового класса, потом для наследника. Конечно это все так, но интересно было увидеть как это реально сделано (как то раньше не обращал на это внимания). Для примера выше - сначала вызывается конструктор В, в нем есть некий код, который будет выполнен до начала выполнения самого тела конструктора и, кроме всего прочего, там есть явный вызов конструктора А, после выполнения конструктора А есть еще какой-то код и только после всего этого начинается выполнение тело конструктора В. Т.е. можно умудриться поставить breakpoint в конструкторе В еще до вызова конструктора А. Я к тому, что
Я конечно примерно так это все и представлял, но почему удивился
0
|
||||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 10.03.2013, 15:52 [ТС] | ||
|
Это конечно на раз выяснялось, но я уж не полез в отладчик теорию опровергать. А полез бы- не было бы этой темы. Не такой уж он и умный, получается, компилятор-то...
0
|
||
|
~ Эврика! ~
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
| 10.03.2013, 15:56 | |
|
Мне вам рассказать про ключи и уровень оптимизации gcc по умолчанию или сами найдёте?
0
|
|
| 10.03.2013, 15:57 | |
|
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||
| 10.03.2013, 16:50 [ТС] | ||||
|
Добавлено через 1 минуту Добавлено через 5 минут
0
|
||||
|
Неэпический
|
|||
| 10.03.2013, 16:53 | |||
|
Не по теме:
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 10.03.2013, 16:57 [ТС] | ||
|
Угу. То есть я правильно вас понял, что вы всё это время знали в чём дело, что вот это вот заблуждение:
0
|
||
| 10.03.2013, 17:05 | |
|
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 10.03.2013, 17:08 [ТС] | |
|
ну хорошо что честно хоть
0
|
|
| 10.03.2013, 17:08 | |
|
Помогаю со студенческими работами здесь
13
Как вызвать методы класса из его конструктора Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект Как создать указатель на функцию-член класса и вызвать его? Как вызывать методы класса по перебору массива с именами методов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|