Читайте также:
|
|
В С++ виртуальные функции (virtual functions) позволяют использовать полиморфизм (polymorhpism) классов. Так как виртуальные функции могут использоваться только внутри классов, то иногда их называют виртуальными методами (virtual methods). полиморфизм (polymorphism) - много (от греческого поли) форм (от греческого морф). Т.е. объекты классов должны храниться в одном массиве.Классы, используемые для получения эффекта полиморфизма, называют полиморфными типами (polymorphic types).
В C++ полиморфизм реализуется через виртуальные функции. Но прежде чем добавлять виртуальные функции к классам, мы рассмотрим динамическое связывание.
Полиморфизм представляет собой способность объекта изменять форму во время выполнения программы. В этом уроке рассмотрены шаги, которые вам необходимо выполнить для создания полиморфных объектов. Из урока 39 вы узнаете, как использовать исключительные ситуации в C++ для обеспечения надежности вашей программы.
Полиморфный объект может изменять форму во время выполнения программы.Вы создаете полиморфные объекты, используя классы, порожденные от существующего базового класса.В базовом для полиморфного объекта классе вы должны определить одну или несколько функций как виртуальные (virtual).В общем случае полиморфные объекты отличаются использованием виртуальных функций базового класса.Для создания полиморфного объекта вам необходимо создать указатель на объект базового класса.Для изменения формы полиморфного объекта вы просто направляете указатель на различные объекты, присваивая новый адрес объекта указателю на полиморфный объект.Чисто виртуальная функция — это виртуальная функция базового класса, для которой в базовом классе не определены операторы. Вместо них базовый класс присваивает такой функции значение 0.Производные классы должны обеспечить определение функции для каждой чисто виртуальной функции базового класса.
Base* object = new Derived;
object->vf();
В данном случае процессор видит, что vf - виртуальный метод. Поэтому он ищет в таблице виртуальных функций нужную запись. Но адрес таблицы виртуальных функций он узнаёт через __vfptr, а этот указатель указывает на таблицу своего класса. Соответственно, будет вызван метод того класса, чей объект вызывает метод vf.Виртуальные функции объявляются с помощью ключевого слова virtual в базовом классе. При этом для базового класса и для всех производных создаётся таблица указателей на функции - виртуальная таблица методов /функций (virtual function table или vtable). Для каждого класса создаётся своя таблица. Количество элементво в таблице равно количеству виртуальных методов. В таблице хранятся фактические адреса методов, определённых в классах. Также в базовом классе объявляется дополнительное поле __vfptr (наследуется всеми производными классами) - указатель на таблицу виртуальных функций класса. Т.е. когда создаётся объект самого класса или любого производного, в нём __vfptr присваивается адрес таблицы виртуальных функций этого класса (или производных).
Виртуальные функции нужны в C++ для поддержки полиморфизма. Полиморфизм позволяет использовать одинаковый синтаксис для разных классов
2. Виртуальные методы и полиморфизм.
Полиморфные объекты.
В общем случае полиморфизм представляет способность объекта изменять форму.
Полиморфизм – возможность замещения метода объекта-родителя одноименными методами объекта-потомка.
При работе с объектами довольно типичной является ситуация, когда сложный метод приходится создавать заново для каждого типа объекта, хотя различия в поведении объектов могут быть небольшими.
В этом случае обычно создается общий сложный метод, а различия вносятся в сменные подчиненные методы.
Реализация такого подхода осуществляется с помощью виртуальных подчиненных методов. С этой целью после заголовка каждого сменного метода требуется написать virtual. Заголовки виртуальных методов предка и потомка должны в точности совпадать, причем оба метода должны быть виртуальными.
Полиморфизм в С++ реализуется не только через виртуальные методы, но и через механизм перегрузки: внутри класса допускается существование нескольких функций с одинаковым именем, но различающимися типами результатов и наборами формальных параметров.
Дата добавления: 2015-08-27; просмотров: 71 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Простые типы данных | | | Друзья-функции и друзья-классы. |