Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Виртуальные (возможные) функции и полиморфизм (способность к модификации)



Для того, чтобы через указатель на базовый класс получить параметры объекта производного класса, согласно приведенному примеру, нужно было сделать 2 операции:

1. Указателю базового класса присвоить адрес объекта производного класса

2. Указатель базового класса преобразовать к типу указателя производного класса

После этого будет получен доступ к функциям-элементам производного класса.

 

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

 

Примеры практических задач:

1. Функция использует в качестве параметра указатель на базовый класс, во время выполнения программы на место этого указателя могут ставиться указатели любого из классов иерархии

2. Объекты классов иерархии находятся в связном списке, какой из элементов списка нужно обработать – заранее неизвестно. Таким образом, для практики необходимо, чтобы доступ к нужным функциям-элементам стал возможным сразу после того, как указателю базового класса будет присвоен адрес объекта производного класса, для этого используются виртуальные функции.

 

Использование виртуальных функций позволяет реализовать механизм позднего связывания. Суть его заключается в следующем:

Если в классе есть хотя бы одна виртуальная функция (признак - virtual float getx () const; ), то для этого класса создается таблица виртуальных функций. В таблице указываются их адреса. Каждая функция в пределах всей иерархии имеет один и тот же адрес, на этапе компиляции осуществляется связь объекта с таблицей виртуальной функции.

Поле для указателя предоставляется конструктору, в который добавлены соответствующие конструкции, пользователю они недоступны (на этапе компиляции).

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

На это требуется дополнительное машинное время, и выполнение программы при наличии виртуальных функций замедляется.

 

Для того, чтобы по указателю на производный класс вызвать функцию-элемент базового класса, т.е. обойти механизм виртуальной функции, поступают таким образом:

c->point::getx();

Правила определения и использование виртуальных функций

Правила:

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

2. Виртуальные функции наследуются, поэтому переопределять их нужно только при отличиях, при этом права доступа изменять нельзя

3. Если виртуальная функция в производном классе переопределена, то объекты этого класса могут получить доступ к виртуальной функции базового класса с помощью записи point::

4. Виртуальная функция не может быть статической, но может быть другом

5. В иерархии классов часто в базовых классах используют чисто виртуальные функции, признак – virtual … (…)=0;

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

6. В производных классах чисто виртуальные функции обязательно должны переопределяться, при этом они могут оставаться снова чисто виртуальными

 

Полиморфизм

Различают:

1. Полиморфные функции

2. Полиморфные объекты

Полиморфной может быть функция, параметром которой является указатель базового класса. При вызове этой функции на место этого указателя могут быть переданы адреса объектов любых классов иерархий. И функция будет выполняться по-разному, т.е. определение функции будет полиморфным.

Если объект определен через указатель путем присваивания адреса этому указателю, то вызов функции с одним и тем же именем для разных объектов будет вызывать разные действия. Фактически полиморфный объект представляет собой совокупность объектов иерархий.

 


Поделиться:



Последнее изменение этой страницы: 2019-05-08; Просмотров: 166; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.011 с.)
Главная | Случайная страница | Обратная связь