|
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
|
|
Таблица виртуальных функций13.04.2010, 20:40. Показов 14309. Ответов 13
Метки нет (Все метки)
объясните плиз кто разбирается..
есть абстрактный класс с двумя виртуальными функциями, от него наследуются два класса реализующие эти функции по своему.. и есть глобальная функция, которая принимает в параметры абстрактный класс, и вызывает виртуальные функции.. при использовании этой функции я подсовываю ей наследников, базового класса вобщем стандартная ситуация по страуструпу.. и вот вопрос как глобальная функция узнает какие ей вызывать функции.. у страуструпа что-то про таблицу виртуальных функций написано, но я не понял сколько их, где хранятся и что хранят.. если кто в курсе поподробнее и помедленее, я записую )
0
|
|
| 13.04.2010, 20:40 | |
|
Ответы с готовыми решениями:
13
Таблица виртуальных функций
Где хранится таблица виртуальных функций? |
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
||||||
| 13.04.2010, 21:29 | ||||||
|
Объект содержит указатель ( 4 байта ) на таблицу виртуальных функций.
0
|
||||||
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
| 13.04.2010, 21:32 | |
|
Quadro9, в таблице виртуальных функций хранятся указатели на реализации соответствующих функций. Объект же содержит указатель на данную таблицу.
1
|
|
|
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
|
|
| 13.04.2010, 21:52 [ТС] | |
|
тоесть если брать мой пример, то все объекты наследников будут содержать указатели на таблицу..
таблица хранится у базового класса? в одном экземпляре? а как она примерно организованна? потомок1 -> функция1 потомок1 -> функция2 потомок2 -> функция1 потомок2 -> функция2 так?
0
|
|
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
|||||||||||
| 13.04.2010, 22:24 | |||||||||||
|
У каждого класса своя таблица. Один экземпляр для всего класса ( для всех объектов одного класса ).
посмотреть, что содержит переменная obj - объект класса MyClass.
2
|
|||||||||||
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
| 13.04.2010, 23:21 | |
|
Вот наилучшее применение виртуальных функций и там написано, много про это, и более простым языком, и так же помимо этого там еще много чего интересного.
https://www.cyberforum.ru/com-ole/thread85437.html Надеюсь тебе эта книга пригодится. Последнюю книгу тебе лучше не качать... Добавлено через 3 минуты Так же тебе может пригодится это для начала. абстрактный базовый класс Добавлено через 3 минуты Alex5: Ты прям как я ковырятель программер, я отладчиком тоже частенько пользуюсь.
1
|
|
|
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
|
||||||
| 13.04.2010, 23:32 [ТС] | ||||||
|
Вобщем как я это понял..
таблицы имеет каждый класс и базовый и его предки, каждый свою.. и в моем примере функция func вызывает нужную функцию класса основываясь на индексе!! тоесть в теле функции я вызываю а.f(), и функция понимает что когда я вызову ее с реальным класом надо посмотреть таблицу этого реального класа и вызвать функцию с индексом [0] ! как то так ![]() с кодом и скриншотом понятнее может будет..
0
|
||||||
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
| 13.04.2010, 23:53 | |
|
А ответ на вопрос, прост.
Каждый созданный Объект имеет свою vtbl - таблицу. Грубо говоря используя указатель базового класса, мы получаем в распоряжение адрес объекта, а с ним и его таблицу функций. Полиморфизм трактуется так: один интерфейс множество реализаций. Интерфейсом можно назвать базовый абстрактный класс, а реализации это производные от него классы, имеющие реализации вирт функций. Через указатель базового класса, так же грубо говоря, мы можем выбирать реализацию: получать адреса объектов производных классов, а с ними и таблицы с реализациями. Надеюсь понятна общая философия зачем нужна прошивка иерархии таблицами. Такой полиморфизм позволяет изменять поведения программы в реальном времени путем перенаведения указателя базового класса с одного объекта на другой объект производного класса. Старался объяснить, может тебе более понятно стало.
1
|
|
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
|||||||
| 14.04.2010, 01:01 | |||||||
|
Каждый класс имеет свою ТВМ ( таблицу виртуальных методов ). Таблица одна для всего класса.
2
|
|||||||
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
||||
| 14.04.2010, 11:53 | ||||
я говорил в общих чертах, для более детального анализа есть книжки и прочее. Добавлено через 12 минут Quadro9: Если хочешь покопаться в нюансах тебе сюда: http://www.devdoc.ru/index.php... l_base.htm Добавлено через 6 минут
Добавлено через 1 минуту Таблица та общая но обращение к ней разных объектов уникальное. Добавлено через 10 минут Не по теме:
Добавлено через 3 минуты Alex5: Не мог бы объяснить что сие значит:
или ты хотел показать что у каждого объекта экземпляр полей данных свой, а таблица одна на всех.
1
|
||||
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
|||||||
| 14.04.2010, 16:03 | |||||||
полю "a.x", какие "a.y"
1
|
|||||||
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
||||||
| 14.04.2010, 16:17 | ||||||
|
В окне дизассемблера можно посмотреть, как вызывается виртуальная функция.
1
|
||||||
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
| 14.04.2010, 16:33 | |
|
Не по теме: Alex5: Тоже им пользуюсь. Добавлено через 9 минут Если у тебя VC++ 6.0 лучше поменяй его, поскорей, что бы сильно не привыкать к нему, просто эта версия уже морально устарела, да и некоторым стандартам C++ не соответствует. И компилятор работает на основании стандарта 98 года, сейчас актуален стандарт 2003. Проекты VC++ 6.0 не будут нормально совместимы с новыми средами разработки, все из-за устаревшего стандарта. Короче менять среду разработки все равно придется.
1
|
|
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
||||||||
| 14.04.2010, 17:05 | ||||||||
|
Не привыкать... Да, пожалуй уже привык ![]()
0
|
||||||||
| 14.04.2010, 17:05 | |
|
Помогаю со студенческими работами здесь
14
Механизм виртуальных функций Использование виртуальных функций
Вызов виртуальных функций Перегрузка виртуальных функций Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|