Как работают виртуальные функции.
Если в базовом классе функция объявлена как виртуальная , то её вызовы будут обрабатываться методом динамического связывания. Ключевое слово virtual предписывает компилятору генерировать дополнительную информацию о функциях.
Предположим, что существует класс GrafObj(x,y) — базовый класс, исходный от него класс Cub(d,w). При создании объекта класс Cub, сначала выполниться конструктор базового класса.
на рисунках представлены схемы работы виртуальной функции Draw VPTR — указатель на таблицу виртуальных функций. Эта таблица содержит указатели на все виртуальные функции класса. При инициализации объекта Cub указатель VPTR указывает на Draw(GrafObj), после работы конструктора самого класса Cub, он перенастраивается для функции Draw для класса Cub (если есть на что настраиваться).Особенностью работы с виртуальными функциями является то ,что они работают только при обращении к ним по ссылке или указателю.
#include<iostream.h>
Class X
{ public:
Virtual double A(double x)
{ return x*x; }
Double B(double x)
{ cout<<A(x)<<":2=";
return A(x)/2.; }
};
class Y:public X
{ public:
Double A(double x)
{ return x*x*x; }
};
Int main(void)
{
Y y;
X x;
cout<<"при x=3."<<endl;
cout<<x.B(3.)<<" X"<<endl;
cout<<y.B(3.)<<" Y"<<endl;
}
результат выполнения программы:
при x=3.
9:2=4.5 X A::X=x*x;
27:2=13.5 Y A::Y=x*x*x
Специфической особенностью указателей на классы в С++ является то, что указатель объявленный, как указатель на базовый класс может использоваться, как указатель на любой класс, производный от этого базового. Компилятор при вызове виртуальной функции определяет класс объекта для которого вызывается виртуальная функция и подбирает соответствующую версию функции.
#include<iostream.h>
Class Mammal
{ public:
Mammal():itsAge(1){}
virtual ~Mammal() {}
virtual void Speak() { cout<< " Млекопитающее что-то сказало!\n";}
protected:
Int itsAge;
};
class Dog:public Mammal
{ public:
void Speak(){cout<<"Гафф!\n";}
};
class Cat:public Mammal
{ public:
void Speak(){cout<<"Мурр!\n";}
};
Дата добавления: 2015-12-26; просмотров: 623;