Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Виртуальные функции






Появление виртуальных функций помогло преодолеть сложности решений с помощью полей типа

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

 

Struct employee{

Char name;

…..

Virtual void print()

 

}

Struct manager: employee[

Employee group;

Short level;

}

Void employee:: print(){

Cout< < ”it”< < department< < emdl;

}

Void manager:: print(){

employee:: Print();

cout< < level< < endl;

}

 

Void printall(employee ll){

For(; ll; ll=ll-> next)

Ll-> print();

}

 

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

Функция employee print печатает информацию о работнике. Логически совпадает с оператором case в предыдущем примере

Функция manager print, печатает информацию как и о работнике, так и специфическую информацию.

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

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

Функция printall печатает список разнотипных объектов вызывая виртуальную функцию член.

 

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

Решение с помощью виртуальных функций имеет следующие преимущества:

· Специфический код обработки собран в функции члены этого же класса

· Никакой дополнительной информации о типе никуда помещать не надо. Нет никакого поля type, не нужно за ним следить.

· В обработчике нет никаких операторов switch

· При добавлении нового класса в иерархию, нам не требуется перекомпиляция всего когда(включая предка). А нужно только описать этот класс и при необходимости переопределить виртуальную функцию.

· Последнее позволяет разрабатывать код независимо и распространять его без исходного кода в виде библиотек.

· Функция printall была написана и откомпилирована задолго до того, как класс manager был задуман.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.