Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Void F1 ( ) ;



int F2 (char*);

};

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

Указатель на базовый класс может принимать конкретные значения.

-Если этот указатель к моменту вызова функции указывает на объект базового класса, вызывается вариант функции из базового класса.

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

Void main () {

A * ap = new A;

B * bp = new B;

C * cp = new C;

ap-> F1 (); // вызов функции базового класса А

ap = bp;

ap-> F1 (); // вызов замещенной функции класса В

ap = cp;

ap -> F1 (); // вызов замещенной функции класса С

}

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

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

Если из текста программы однозначно следует какая функция вызывается, компилятор включает в текст оператор call c именем функции, компоновщик заменяет имя на фактический адрес функции.

Такой процесс вызова функции носит название раннего связывания.

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

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

Для реализации динамического связывания компилятор создает таблицу виртуальных методов (vtbl), а к каждому объекту добавляет скрытое поле ссылки (vptr) на таблицу vtbl.

Применена технология использования информации о типе на этапе выполнения, или сокращенно RTTI — Run-Time Туре Information. Дело в том, что заранее (на этапе компиляции) не известно, объекты каких типов будут передаваться в качестве аргумента данного метода на указатель или ссылку базового класса.

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

Механизм виртуальных функций в ООП обеспечивает большую гибкость при использовании уже готовых библиотек классов, а также существенно увеличивает возможности программиста.





Дата публикования: 2014-11-28; Прочитано: 262 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...