русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Понятие виртуальной функции


Дата добавления: 2015-07-09; просмотров: 497; Нарушение авторских прав


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

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

 

 

class A {

public:

virtual void F1 ( ) ;

virtual int F2 ( char* ) ;

} ;

class B : public A {

public:

virtual void F1 ( ) ;

virtual int F2 ( char* ) ;

} ;

class C : public A {

public:

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 именем функции, компоновщик заменяет имя на фактический адрес функции.

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

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

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

 

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

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

 



<== предыдущая лекция | следующая лекция ==>
 | Объект А Объект В


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.428 сек.