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

Виртуальные методы

Читайте также:
  1. I. Методы выбора инновационной политики
  2. II. Вывод и анализ кинетических уравнений 0-, 1-, 2-ого порядков. Методы определения порядка реакции
  3. II. Методы прогнозирования и поиска идей
  4. V. Правила и методы исследований при трансфузии (переливании) консервированной донорской крови и эритроцитсодержащих компонентов
  5. Административные методы управления
  6. Административные методы управления природопользованием и охраной окружающей среды.
  7. Анализ воспитательного потенциала семьи. Методы изучения семьи.
  8. Анализ результатов теста. Стили и методы семейного воспитания
  9. Антропогенные воздействия на гидросферу и их экологические последствия. Методы защиты гидросферы.
  10. Апикально-корональные методы препарирования
  11. АЭРОТЕРАПИЯ И ЕЕ ОСНОВНЫЕ МЕТОДЫ
  12. Базовые методы реанимации

В обоих классах, выведенных из класса Item, имеется метод Title, выдающий в качестве результата заглавие книги или название журнала. Кроме этого метода, полезно было бы иметь метод, выдающий полное название любой единицы хранения. Реализация этого метода различна, поскольку название книги и журнала состоит из разных частей. Однако вид метода – возвращаемое значение и аргументы – и его общий смысл один и тот же. Название – это общее свойство всех единиц хранения в библиотеке, и логично поместить метод, выдающий название, в базовый класс.

class Item

{

public:

virtual String Name(void) const;

...

};

class Book: public Item

{

public:

virtual String Name(void) const;

...

};

class Magazine: public Item

{

public:

virtual String Name(void) const;

...

};

Реализация метода Name для базового класса тривиальна: поскольку название известно только производному классу, мы будем возвращать пустую строку.

String

Item::Name(void) const

{

return "";

}

Для книги название состоит из фамилии автора, названия книги, издательства и года издания:

String

Book::Name(void) const

{

return author + title + publisher +

String(year);

}

У журнала полное название состоит из названия журнала, года и номера:

String

Magazine::Name(void) const

{

return title + String(year) +

String(number);

}

Методы Name определены как виртуальные с помощью описателя virtual, стоящего перед определением метода. Виртуальные методы реализуют идею полиморфизма в языке Си++. Если в программе используется указатель на базовый класс Item и с его помощью вызывается метод Name:

Item* ptr;

...

String name = ptr->Name();

то по виду вызова метода невозможно определить, какая из трех приведенных выше реализаций Name будет выполнена. Все зависит от того, на какой конкретный объект указывает указатель ptr.

Item* ptr;

...

if (type == "Book")

ptr = new Book;

else if (type == "Magazine")

ptr = new Magazine;

...

String name = ptr->Name();

В данном фрагменте программы, если переменная type, обозначающая тип библиотечной единицы, была равна " Book ", то будет вызван метод Name класса Book. Если же она была равна " Magazine", то будет вызван метод класса Magazine.

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

Приведем еще один пример виртуального метода. Предположим, в графическом редакторе при нажатии определенной клавиши нужно перерисовать текущую форму на экране. Форма может быть квадратом, кругом, эллипсом и т.д. Мы введем базовый класс для всех форм Shape. Конкретные фигуры, с которыми работает редактор, будут представлены классами Square (квадрат), Circle(круг), Ellipse (эллипс), производными от класса Shape. Класс Shape определяет виртуальный метод Draw для отображения формы на экране.

class Shape

{

public:

Shape();

virtual void Draw(void);

};

//

// квадрат

//

class Square: public Shape

{

public:

Square();

virtual void Draw(void);

private:

double length; // длина стороны

};

//

// круг

//

class Circle: public Shape

{

public:

Circle();

virtual void Draw(void);

private:

short radius;

};

...

Конкретные классы реализуют данный метод, и, разумеется, делают это по-разному. Однако в функции перерисовки текущей формы, если у нас имеется указатель на базовый класс, достаточно лишь записать вызов виртуального метода, и динамически будет вызван нужный алгоритм рисования конкретной формы в зависимости от того, к какому из классов (Square, Circle и т.д.) принадлежит объект, на который указывает указатель shape:

Repaint(Shape* shape)

{

shape->Draw();

}


1 | 2 | 3 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)