Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Виртуальные функции
Появление виртуальных функций помогло преодолеть сложности решений с помощью полей типа Программист в базовом классе определяет функции как виртуальные, эти функции можно переопределять в наследнике. В этих функция в наследниках описывается именно специфическое поведение для данного наследника. При этом компилятор автоматически обеспечивает правильное соответствие между объектами и применяемыми к ним функциями.
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 был задуман.
|