32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
|
|
1 | |
Таблица виртуальных функций13.04.2010, 20:40. Просмотров 12543. Ответов 13
Метки нет Все метки)
(
объясните плиз кто разбирается..
есть абстрактный класс с двумя виртуальными функциями, от него наследуются два класса реализующие эти функции по своему.. и есть глобальная функция, которая принимает в параметры абстрактный класс, и вызывает виртуальные функции.. при использовании этой функции я подсовываю ей наследников, базового класса вобщем стандартная ситуация по страуструпу.. и вот вопрос как глобальная функция узнает какие ей вызывать функции.. у страуструпа что-то про таблицу виртуальных функций написано, но я не понял сколько их, где хранятся и что хранят.. если кто в курсе поподробнее и помедленее, я записую ![]()
0
|
|
13.04.2010, 20:40 | |
Таблица виртуальных функций
Где хранится таблица виртуальных функций? Механизм виртуальных функций |
|
1127 / 786 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
||||||
13.04.2010, 21:29 | 2 | |||||
Объект содержит указатель ( 4 байта ) на таблицу виртуальных функций.
0
|
![]() 2331 / 1704 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
13.04.2010, 21:32 | 3 |
Quadro9, в таблице виртуальных функций хранятся указатели на реализации соответствующих функций. Объект же содержит указатель на данную таблицу.
1
|
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
|
|
13.04.2010, 21:52 [ТС] | 4 |
тоесть если брать мой пример, то все объекты наследников будут содержать указатели на таблицу..
таблица хранится у базового класса? в одном экземпляре? а как она примерно организованна? потомок1 -> функция1 потомок1 -> функция2 потомок2 -> функция1 потомок2 -> функция2 так?
0
|
1127 / 786 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
|||||||||||
13.04.2010, 22:24 | 5 | ||||||||||
У каждого класса своя таблица. Один экземпляр для всего класса ( для всех объектов одного класса ).
посмотреть, что содержит переменная obj - объект класса MyClass.
2
|
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
13.04.2010, 23:21 | 6 |
Вот наилучшее применение виртуальных функций и там написано, много про это, и более простым языком, и так же помимо этого там еще много чего интересного.
Кто хочет знать: что такое COM: сюда Надеюсь тебе эта книга пригодится. Последнюю книгу тебе лучше не качать... Добавлено через 3 минуты Так же тебе может пригодится это для начала. абстрактный базовый класс Добавлено через 3 минуты Alex5: Ты прям как я ковырятель программер, я отладчиком тоже частенько пользуюсь.
1
|
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
|
||||||
13.04.2010, 23:32 [ТС] | 7 | |||||
Вобщем как я это понял..
таблицы имеет каждый класс и базовый и его предки, каждый свою.. и в моем примере функция func вызывает нужную функцию класса основываясь на индексе!! тоесть в теле функции я вызываю а.f(), и функция понимает что когда я вызову ее с реальным класом надо посмотреть таблицу этого реального класа и вызвать функцию с индексом [0] ! как то так ![]() с кодом и скриншотом понятнее может будет..
0
|
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
13.04.2010, 23:53 | 8 |
А ответ на вопрос, прост.
Каждый созданный Объект имеет свою vtbl - таблицу. Грубо говоря используя указатель базового класса, мы получаем в распоряжение адрес объекта, а с ним и его таблицу функций. Полиморфизм трактуется так: один интерфейс множество реализаций. Интерфейсом можно назвать базовый абстрактный класс, а реализации это производные от него классы, имеющие реализации вирт функций. Через указатель базового класса, так же грубо говоря, мы можем выбирать реализацию: получать адреса объектов производных классов, а с ними и таблицы с реализациями. Надеюсь понятна общая философия зачем нужна прошивка иерархии таблицами. Такой полиморфизм позволяет изменять поведения программы в реальном времени путем перенаведения указателя базового класса с одного объекта на другой объект производного класса. Старался объяснить, может тебе более понятно стало.
1
|
1127 / 786 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
||||||
14.04.2010, 01:01 | 9 | |||||
Не объект, а класс
Каждый класс имеет свою ТВМ ( таблицу виртуальных методов ). Таблица одна для всего класса.
2
|
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
14.04.2010, 11:53 | 10 |
я говорил в общих чертах, для более детального анализа есть книжки и прочее. Добавлено через 12 минут Quadro9: Если хочешь покопаться в нюансах тебе сюда: http://www.devdoc.ru/index.php... l_base.htm Добавлено через 6 минут Добавлено через 1 минуту Таблица та общая но обращение к ней разных объектов уникальное. Добавлено через 10 минут Не по теме:
Добавлено через 3 минуты Alex5: Не мог бы объяснить что сие значит: или ты хотел показать что у каждого объекта экземпляр полей данных свой, а таблица одна на всех.
1
|
1127 / 786 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
||||||
14.04.2010, 16:03 | 11 | |||||
полю "a.x", какие "a.y"
1
|
1127 / 786 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
||||||
14.04.2010, 16:17 | 12 | |||||
В окне дизассемблера можно посмотреть, как вызывается виртуальная функция.
1
|
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
14.04.2010, 16:33 | 13 |
Не по теме: Alex5: Тоже им пользуюсь. Добавлено через 9 минут Если у тебя VC++ 6.0 лучше поменяй его, поскорей, что бы сильно не привыкать к нему, просто эта версия уже морально устарела, да и некоторым стандартам C++ не соответствует. И компилятор работает на основании стандарта 98 года, сейчас актуален стандарт 2003. Проекты VC++ 6.0 не будут нормально совместимы с новыми средами разработки, все из-за устаревшего стандарта. Короче менять среду разработки все равно придется.
1
|
1127 / 786 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
||||||
14.04.2010, 17:05 | 14 | |||||
Да, согласен.
Не привыкать... Да, пожалуй уже привык ![]() Пример. Частичная специализация шаблонов классов - компилятор VS-6 выдаёт ошибку.
0
|
14.04.2010, 17:05 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Использование виртуальных функций
Вызов виртуальных функций Перегрузка виртуальных функций Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |