Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_24-38.docx
Скачиваний:
19
Добавлен:
11.05.2015
Размер:
127.57 Кб
Скачать

32. Полиморфизм.

Полиморфизм - переопределение наследником функций-членов базового класса.

Допустим, на экране есть некоторый набор команд, каждая из которых выполняет некоторые действия после того, как пользователь выбрал эту команду и инициализировал её выполнение. В этой ситуации удобно определить каждую команду в виде объекта, а функцию-член этого объекта, реализующего действия команды, назвать одним именем для всех объектов. Конкретная реализация функции (с учётом объекта) будет определяться во время выполнения программы. Это свойство и называется полиморфизмом (в переводе с греческого: polymorphism – много форм). C++ поддерживает полиморфизм посредством виртуальных функций, которые могут имитироваться с помощью указателей на функции.

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

// базовый класс

class MyClass{

public:

// виртуальный метод

virtual int metod(int arg1,int arg2){

return arg1+arg2;}

// чистый виртуальный метод

virtual int metod2() const =0;

};

//-------------------------------------

// производные классы

class MyClass2: public MyClass {

//переопределяем виртуальные методы

int metod(int arg1,int arg2){

return arg1*arg2;}

int metod2() const {return 2;};

};

class MyClass3: public MyClass {

//переопределяем виртуальные методы

int metod(int arg1,int arg2){

return arg1%arg2;}

int metod2() const {return 3;};

};

class MyClass4: public MyClass3 {

//переопределяем виртуальные методы

int metod2() const {return 4;};

};

//--------------------------------

// следующие две функции могут принимать

// в качестве аргумента

// любой производный класс от MyClass

// с определенным методом int metod2() const

void outMetod2(const MyClass*ptr){

cout<<ptr->metod2()<<endl;

}

void outMetod2(const MyClass&ref){

cout<<ref.metod2()<<endl;

}

int main() {

// полиморфизм в деле

outMetod2(MyClass2());

outMetod2(MyClass3());

outMetod2(MyClass4());

return 0;

}

33. Виртуальная функция.

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

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

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

Пример, где каждый из производных классов (CMom и CDad) наследует по одному набору членов из виртуального базового класса CParent. Класс CKid является производным двух базовых классов CMom и CDad, которые, в свою очередь, являются производными от CParent, но несмотря на это класс CKid так же наследует только одну копию членов класса CParent:

class CMom: virtual public CParent

{

};

class CDad: virtual public CParent

{

};

class CKid: public CMom, public CDad

{

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]