0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 13
|
|
1 | |
Вызов виртуальной функции по указателю21.06.2012, 23:41. Показов 7189. Ответов 30
Метки нет (Все метки)
Суть в том, что преподаватель дал задание на защиту курсовой: вызов по указателю виртуальной функции из ТВР, искал в интернете, наткнулся на этом форуме на то, что доступа прямого к таблице нет, может кто-то подсказать или подкинуть статью/литературу, время до утра, поэтому буду благодарен за оперативность.
0
|
21.06.2012, 23:41 | |
Ответы с готовыми решениями:
30
Вызов виртуальной функции по нулевому указателю Вызов функции по указателю Вызов функции по указателю из класса Вызов виртуальной функции |
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
22.06.2012, 01:10 | 2 |
то, что вам предлагают - хак. чтобы вызвать функцию через таблицу виртуальных функций, нужно знать где она находится и как устроено. и то и другое зависит от компилятора и нужно либо найти документацию, либо экспериментами всякими попробовать это определить. таблица может находится в начале объекта или в конце. плюс возможно она рассположена с выравниванием. в таблице функции вроде тоже могут быть в неопределенном порядке. если так, то тут тоже нужно экспериментами искать индекс нужной функции.
В общем очень странное требование какое-то. Может вы что-то не так поняли и от вас хотят просто вызов виртуальной функции через указатель на объект? И что такое ТBP?
1
|
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 13
|
|
22.06.2012, 01:20 [ТС] | 3 |
Таблица Виртуальных Функций, опечатался))
Ну то, что я написал это изначальная формулировка, потом, конечно, я встречный вопрос задал "просто по указателю вызвать виртуальную функцию", он ответил да. Скажем так преподаватель интересный сам по себе и кинул фразу "хочу увидеть реализацию, ну или хотя бы попытку", возможно действительно стоит не морочиться на таблице, думаю такое даже он бы не загнул, а по указателям на виртуальные функции, если можете подкиньте инфу или кусок кода, хотя бы абстрактный, спасибо, что помогли убедиться в понимании задачи и проблемах ее даже теоретической реализации))
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
22.06.2012, 01:31 | 4 |
Вот найдите в сети эту книжку:
Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов http://rsdn.ru/res/book/cpp/most_effective_cpp.xml Правило 24. Там штук 10 страниц. В ней немного расписано о том, как происходит вызов нужной виртуальной функции, где она может расспологатся и т.п.
0
|
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
|
|
22.06.2012, 01:38 | 5 |
1
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|||||||||||
22.06.2012, 01:55 | 7 | ||||||||||
Сообщение было отмечено как решение
Решение
Blazik, все просто:
Добавлено через 4 минуты Вот пример вызова метода, обращающегося к this:
9
|
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 13
|
|
22.06.2012, 02:04 [ТС] | 8 |
Подумал, вспомнил, что преподаватель объяснял про таблицу, в которой расположены адреса, все же требуется работа с таблицей значит, но всем спасибо, возможно поможет статья на английском.
0
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
22.06.2012, 02:06 | 9 |
Blazik, постом выше примеры вызова вирутальных методов напрямую через vtable.
0
|
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 13
|
|
22.06.2012, 02:41 [ТС] | 10 |
CyBOSSeR, да-да, сейчас как раз разбираю этот код
Добавлено через 29 минут CyBOSSeR, большое спасибо, дополнил код для наглядности происходящего в таблице при использовании наследующих классов, очень помогло.
0
|
Каратель
|
|||||||||||
22.06.2012, 14:08 | 11 | ||||||||||
Что-то gcc хитрит, какое всё-таки у него соглашение вызовов для методов класса? В MSVS2010 этот код тоже работает, но при выводе значения поля field выводит 0 вместо 100.
Немного переделанный код CyBOSSeR-а
MSVS2010
1
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
23.06.2012, 00:13 | 12 |
Ладно, с виртуальными функциями все понятно, вопрос где RTTI хранится. Всегда думал (и продолжаю), что одним из указателей в таблице виртуальных функций является указатель на RTTI, но вчера с наскока методом тыка, найти ничего внятного найти не удалось. Надо посмотреть реализацию typeid.
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
23.06.2012, 02:13 | 13 | |||||
рассположение зависит от компилятора. чтобы узнать наверняка, нужно задиассемблировать строку получения указателя на type_info.
// const std::type_info* pTypeInfo = &typeid(rBase); 00414772 mov eax,dword ptr [ebp-20h] 00414775 push eax 00414776 call @ILT+50(___RTtypeid) (411037h) 0041477B add esp,4 0041477E mov dword ptr [ebp-2Ch],eax Т.е. идет вызов функции ___RTtypeid с передачей ей указателя на объект. Студия так же говорит, что она в файле rtti.cpp. Вот что-то похожее нашел тут: http://code.google.com/p/ontl/... .cpp?r=741 Вот кому нужно - попробуйте разобратся. Код достаточно хитрый. Наверно из-за того, что нужно учитывать всякие множественные наследования + всякие другие провреки
1
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
||||||
23.06.2012, 02:27 | 14 | |||||
С GCC в простейшем случае все просто:
0
|
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 13
|
|
23.06.2012, 02:45 [ТС] | 15 |
ну в общем пришел я с кодом, а меня отослали куда подальше, ну по крайней мере теперь есть четкая задача, и как минимум я должен дать преподавателю четкий ответ на вопрос - где в объекте класса находится указатель на виртуальную таблицу)
0
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
23.06.2012, 14:09 | 16 |
Blazik, адрес указателя на таблицу вируальных функций совпадает с адресом объекта, т.е. в начале.
1
|
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 13
|
|
24.06.2012, 01:47 [ТС] | 17 |
CyBOSSeR, спасибо, значит ответил я верно) ну значит теперь главное реализовать программное решение, которое у меня запросили)
Добавлено через 10 часов 33 минуты а вот такой вопрос появился, если я вызываю по указателю функцию, как я могу передать ей параметр?
0
|
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 13
|
|
24.06.2012, 02:46 [ТС] | 19 |
CyBOSSeR, уже сам сделал)
если мне сказали создать явный конструктор, но при этом объект не должен обладать свойствами и нужен лишь для обнаружения адреса я делаю пустой конструтор Basic::Basic() {}; или я не прав?
0
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
24.06.2012, 02:50 | 20 |
Blazik, адрес у объекта, есть в любом случае, есть у него контсруктор или нет не важно. Пустой конструктор за Вас и компилятор и так сгенерит.
0
|
24.06.2012, 02:50 | |
24.06.2012, 02:50 | |
Помогаю со студенческими работами здесь
20
Не работает вызов виртуальной функции из класса потомка Вызов виртуальной функции через указатель на базовый класс Вызов виртуальной функции vs несколько dynamic_cast подряд: что быстрее? Вызов виртуальной функции, определённой в дочернем классе, через указатель на базовый класс Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |