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

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

Читайте также:
  1. Аэродинамический расчет вентиляционной сети
  2. Виды дипломатических и консульских структур РФ за рубежом, их задачи и функции. Порядок выезда из РФ российских граждан и виды оформляемых для этого паспортов.
  3. Виртуальные клавиши. Системные таймеры. Срабатывание таймера. Эффективное использование механизма таймеров.
  4. Виртуальные реальности
  5. Глава 7 ПОЗДНЕЕ ОБУЧЕНИЕ — НАШЕ ВОЗДЕЙСТВИЕ НА РАЗВИВАЮЩИЙСЯ РАЗУМ
  6. Градации структуры, сопровождаемые сменой функции.
  7. ДИНАМИЧЕСКИЙ — СТАТИЧЕСКИЙ

Полиморфизм (polymorphism) (от греческого polymorphos) - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных. Например для языка Си, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трёх различных функций: abs(), labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. В С++ каждая из этих функций может быть названа abs(). Тип данных, который используется при вызове функции, определяет, какая конкретная версия функции действительно выполняется. В С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функций (function overloading).

В более общем смысле, концепцией полиморфизма является идея "один интерфейс, множество методов". Это означает, что можно создать общий интерфейс для группы близких по смыслу действий. Преимуществом полиморфизма является то, что он помогает мнижать сложность программ, разрешая использование того же интерфейса для задания единого класса действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор. Вам, как программисту, не нужно делать этот выбор самому. Нужно только помнить и использовать общий интерфейс. Пример из предыдущего абзаца показывает, как, имея три имени для функции определения абсолютной величины числа вместо одного, обычная задача становится более сложной, чем это действительно необходимо.

Полиморфизм может применяться также и к операторам. Фактически во всех языках программирования ограниченно применяется полиморфизм, например, в арифметических операторах. Так, в Си, символ + используется для складывания целых, длинных целых, символьных переменных и чисел с плавающей точкой. В этом случае компилятор автоматически определяет, какой тип арифметики требуется. В С++ вы можете применить эту концепцию и к другим, заданным вами, типам данных. Такой тип полиморфизма называется перегрузкой операторов (operator overloading).

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

Спецификатор virtual создаёт виртуальную функцию. Виртуальная функция — это член базового класса, который может быть переопределён производным классом. Если функция не переопределяется производным классом, используется определение базового класса.

Чистая виртуальная функция — предоставляет собой функцию-член, которая не имеет определения. Это значит, что чистая виртуальная функция должна быть переопределена в производном классе. Прототип чистой виртуальной функции записывается следующим образом.

virtual тип_возврата имя_функции (список_параметров) = 0;

Элемент "= 0" сообщает компилятору, что эта виртуальная функция не имеет определения, связанного с базовым классом.

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

При вызове метода с использованием указателя на базовый класс действуют следующие правила:

В результате при создании указателя базового класса, который указывают на объект производного класса будет вызываться метод производного класса. Например.

class Base

{

public:

virtual void VM();

void M();

};

class Derived: public Base

{

public:

void VM();

void M();

};

 

Derived D; //объект производного класса Derived;

Derived *pD = &D; //указатель на объект D классы Derived

Base *pB = &D; //указатель на объект D классы Base

 

pB->VM(); //вызов метода VM класса Derived

pD->VM(); //вызов метода VM класса Derived

pB->M(); //вызов метода M класса Base

pD->M(); //вызов метода M класса Derived

 

/*если бы ключевое слово virtual не стояло в классе B,

то вызовы производились бы следующим образом*/

pB->VM(); //вызов метода VM класса B

pD->VM(); //вызов метода VM класса Derived

pB->M(); //вызов метода M класса Base

pD->M(); //вызов метода M класса Derived

Итак, было показано, что виртуальные методы можно использовать для возможности использования методов созданных в производных классах.


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


Читайте в этой же книге: Неполный конструктор | Перезагрузка конструкторов | Перегрузка операций (операторов). Понятие перегрузки операторов. Синтаксис перегрузки операции. Перегрузка бинарных операторов. | Перегрузка операций (операторов). Перегрузка операторов отношения и логических операторов. Перегрузка оператора присваивания. Перегрузка унарных операторов. | Перегрузка операций (операторов). Перегрузка операторов инкремента и декремента. Перегрузка оператора индексирования. Перегрузка оператора вызова функции. | Длина самого длинного слова 10 | Самое длинное слово beautiful | Строковые потоки | Состояние формата (ОТНОСИТСЯ К ПОСЛЕДНЕМУ ВОПРОСУ, КОТОРЫЙ 24) | Работа с несовместимыми конструкциями. |
<== предыдущая страница | следующая страница ==>
Перегрузка операций (операторов). Перегрузка операторов доступа к членам класса. Перегрузка операторов new и delete. Функции преобразования типа.| Полиморфизм и виртуальные функции. Применение динамического полиморфизма. Виртуальные деструкторы. Абстрактные классы и чисто виртуальные функции.

mybiblioteka.su - 2015-2024 год. (0.009 сек.)