Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
vi_kasatkin
Сообщений: n/a
#1

Как реализован полиморфизм? - C++

20.03.2009, 22:19. Просмотров 1155. Ответов 3
Метки нет (Все метки)

Если я не ошибаюсь, то, благодаря ему, если member-функция fun в базовом классе CBase объявлена как virtual, и перегружена в производном CDerived, то при вызове pBaseObj->fun то, какая функция вызывается, определяется тем, что присвоено pBaseObj (определенном, как CBase*). Как это может быть реализовано совершенно непонятно. Ведь в книжке по MS-DOS-овскому C++ написано, что объект класса, имеющего одну переменную типа int занимает ровно 2 байта, сколько бы ни было функций, определенных для этого класса. Так что информацию о том, какому классу принадлежит этот объект хранить негде.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2009, 22:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как реализован полиморфизм? (C++):

Как реализован deque в STL ? - C++
Как реализован deque в STL ? Насколько я понимаю условно все разделяется на блок с адресами и блоки с данными. Есть какие-то...

Как реализован .end() std::map? - C++
Как реализован .end() std::map? Не понимаю, какая у него реализация. Либо он указывает на root дерева, либо на фиктивную ноду либо на что...

Как правильно реализовать полиморфизм? - C++
Имеется такая иерархия классов //classes.h class CL1 { private: int x; virtual char c;

Объясните как работает полиморфизм на моем примере - C++
Здравствуйте уважаемые. Пожалуйста объясните на моем примере, как это работает. Выдержки из моего кода. class Instrumenti { ...

Полиморфизм. Как в предке объявить статический массив, который можно будет использовать в наследниках? - C++
Всем привет. Мне необходимо в классе предке объявить статический массив который можно будет использовать в наследниках. Не очень хочется...

Как реализован unordered_map? - C++
Собственно, интересна именно практическая сторона вопроса, как реализуется идеальное хеширование за O(1) в среднем ясно, об этом можно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kirillov
Сообщений: n/a
21.03.2009, 11:56 #2
Хм... воможно я ошибаюсь, но насколько я помню, при компиляции строится таблица виртуальных вызово - вот по ней все это и проверяется. Или еще вариант - через dynamic_cast
palva
2609 / 1831 / 262
Регистрация: 08.06.2007
Сообщений: 6,989
Записей в блоге: 4
21.03.2009, 19:22 #3
Классы, которые содержат виртуальные функции члены или наследуют их компилируются особым образом:

1. Каждая функция такого класса содержит дополнительный скрытый от пользователя параметр, который будет содержать указатель на таблицу виртуальных функций, то есть на массив, содержащий адреса входов во все виртуальные функции доступные из класса.

2. При компиляции функции члена обращение к виртуальной функции осуществляется не по имени функции а по ее номеру в таблице виртуальных функций.

3. Для каждого класса, исользующиего виртуальные функции строится таблица (глобальный статический массив), которая содержит ссылки на функции члены виртуальных классов (возможно принадлежащие различным классам в иерархии наследования классов).

4. При компиляции вызова любой функции-члена компилятору доступно имя класса, которому принадлежит объект (или указатель на объект), поэтому он просто закладывает в код передачу в виде константы ссылки на таблицу соответствующего класса.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2009, 19:22
Привет! Вот еще темы с ответами:

Реализация кода Гаусса(почти реализован ). - C++
Добрый день. Поздравляю всех с наступающим новым годом! Понимаю, все заняты., дела, дела, дела.. Совсем недавно Я таки смог реализовать...

Правильно ли реализован алгоритм нахождения произведения суммы? - C++
Найти произведение суммы \prod_{j=1}^{m}\sum_{i=1}^{n}(3*i-j) Правильно я составил? или нет? так как если я изменяю p=0 на p=1 выдаёт...

Разобрать код, в котором реализован виртуальный метод - C++
Всем привет! Вопрос под кодом. #include <cstdlib> #include <iostream> using namespace std; class A ...

Полиморфизм в с++ - C++
Вообщем я делал программу,изначально в ней было реализовано наследование.Затем дали задание реализовать полиморфзим для функции Scale для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
palva
2609 / 1831 / 262
Регистрация: 08.06.2007
Сообщений: 6,989
Записей в блоге: 4
21.03.2009, 19:22 #4
Классы, которые содержат виртуальные функции члены или наследуют их компилируются особым образом:

1. Каждая функция такого класса содержит дополнительный скрытый от пользователя параметр, который будет содержать указатель на таблицу виртуальных функций, то есть на массив, содержащий адреса входов во все виртуальные функции доступные из класса.

2. При компиляции функции члена обращение к виртуальной функции осуществляется не по имени функции а по ее номеру в таблице виртуальных функций.

3. Для каждого класса, исользующиего виртуальные функции строится таблица (глобальный статический массив), которая содержит ссылки на функции члены виртуальных классов (возможно принадлежащие различным классам в иерархии наследования классов).

4. При компиляции вызова любой функции-члена компилятору доступно имя класса, которому принадлежит объект (или указатель на объект), поэтому он просто закладывает в код передачу в виде константы ссылки на таблицу соответствующего класса.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru