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

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

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

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

20.03.2009, 22:19. Просмотров 1149. Ответов 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     Как реализован полиморфизм?
Посмотрите здесь:

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

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

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

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

Реализация кода Гаусса(почти реализован ). - 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++
Вот сделал прогу а ее надо было сделать полиморфизмом - кому несложно переделайте #include <iostream.h> #include <conio.h> ...

С++ и полиморфизм - C++
Здравствуйте. Ответьте пожалуйста на несколько вопросов: 1. Что такое абстрактная функция простыми словами? 2. Что такое...

полиморфизм=( - C++
Ув.Знатаки Доброго времени суток!Вот есть проблемка с написание полиморфизма,вот написал класс,написал наследование,а вот как теперь сюда...


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

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

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

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

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

4. При компиляции вызова любой функции-члена компилятору доступно имя класса, которому принадлежит объект (или указатель на объект), поэтому он просто закладывает в код передачу в виде константы ссылки на таблицу соответствующего класса.
Yandex
Объявления
21.03.2009, 19:22     Как реализован полиморфизм?
palva
2561 / 1783 / 251
Регистрация: 08.06.2007
Сообщений: 6,910
Записей в блоге: 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