Загрузка...

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


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

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

Пример: имеется 3 класса: класс В производный от класса А, а класс С производный от класса В.

A aObject; //Объявление объектов классов

B bОbject;

C cОbject;

По определению указатель на класс А может ссылаться на любой из этих объектов, так как они связаны наследова-нием. Эта взаимосвязь работает только в одном направлении.

A *p;

p = &cОbject;

Этот принцип становится особенно важным, если в связанных отношениями родства классах определяются виртуальные функции.

Эти Функции имеют точно такой же вид и программируются точно так же, как обыкновенные, но добавляется ключевое слово virtual.

class A

{ public:

virtual void vf();

};

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

class B: public A {

public:

virtual void vf();

};

Когда в классе определяется виртуальная функция, имеющая одинаковое имя с виртуальной функцией класса-предка, такая функция называется замещающей. Указатель *р ссылается на объект типа С, следовательно

р->vf(); //указывает на виртуальную функцию класса С.

// Программа 3 //Пример виртуальной функции

#include <iostream.h>

class TValue {

public:

virtual double func(double x) { return x*x; }

double culc(double x) { return func(x)/2; }

};

class DValue: public TValue {

public:

virtual double func(double x) { return x*x*x; }

};

void main()

{

TValue obj1;

cout << obj1.culc(3) << endl;

DValue obj2;

cout << obj2.culc(3) << endl;

}

Чистая виртуальная функция — это пустое место, ожидающее своего заполнения производным классом. Объявляется точно так же, как и обычная, только ее объявление в классе завершается = 0.

Например:

class Abstract {

public:

virtual void f1(void) ; //обычная виртуальная

virtual void f2(void) = 0 ; //чистая виртуальная

};

Компилятору не потребуется реализация функции-члена f2 в отличии от остальных функций-членов в классе.

Если класс содержит хотя бы одну чисто виртуальную функцию-член, он называется абстрактным классом. Абстрактный класс это всего лишь схема, на основании которой можно создавать производные классы. Чтобы использовать абстрактный класс, следует вывести из него новый класс:

class MyClass: public Abstract {

public:

virtual void f2(void); //бывшая чисто виртуальная функция

};

Загрузка...