Виртуальные функции элементы
Указание виртуального метода «говорит» компилятору о том, что вызывать следует метод соответствующий классу переменной. Выбор такого метода может быть сделан только во время выполнения программы. Поэтому говорят об активизации динамического связывания (или позднего связывания) операции или метода с объектом. Если метод не виртуальный, то компилятор выбирает операцию или метод для объекта статически на основе объявления переменной или на основе вычисления типа выражения на этапе компиляции программы.
Пример
BankAccount bretla;//объект базового класса
Overdraft ophelia;//объект производного класса
bretla.ViewAcct();//вызов BankAccount::ViewAcct
ophelia.ViewAcct();//вызов Overdraft::ViewAcct
BankAccount* bp = &bretla;
bp->ViewAcct();//вызов BankAccount::ViewAcct
bp = &ophelia;//полиморфизм наследования, можно связывать объекты подклассов
bp->ViewAcct();//вызов BankAccount::ViewAcct
Что делать, если мы хотим, чтобы вызывался метод, связаный с классом Overdraft, по типу объекта. Надо активизировать динамическое связывание. Для этого перед описанием метода необходимо указать ключевое слово virtual.
Статическое связывание работает быстрее. Динамическое используется только, когда это необходимо. Только если метод в базовом классе будет переопределён в производном, - его следует делать виртуальным. Конструкторы не могут быть виртуальными.
Деструкторы в случае, если класс будет использоваться как базовый – должны быть виртуальными, даже если им нечего делать и они пустые. |
Так, в представленном ранее примере достаточно вставить слово virtual в спецификацию класса BankAccount, в отсальных можно этого не делать, но из необходимо рекомпилировать:
class BankAccount
{
virtual void Withdraw(double amt);
virtual void ViewAcct() const;
}
В классе Overdraft можно указать virtual ~Overdraft(). Как только в базовом классе указано virtual, то все переопределенные в подклассах методы автоматически становятся виртуальными.
Абстрактные классы
Они позволяют обобщить свойства и методы 2-х и более классов в едином над классе. Затем он может использоваться как базовый класс. Признаком абрактоного класса являетяс наличие хотя бы одной нереализованной виртуальной функции (или чистой виртуальной функции). Тело такой функции имеет вид: = 0.
Объекты абстрактных классов не создаются, хотя конструктор можно использовать для инициализации переменных во время создания объектов производных не абстрактных классов.
Пример
class BaseEllipse//абстрактный базовый класс для эллипса и круга
{
private:
double x;//координаты центра
double y;
public:
BaseEllipse(double x0=0,double y0=0):x(x0),y(y0){}
virtual ~BaseEllipse(){}
void Move(int nx, int ny) {x=nx; y=ny;}
virtual double Area() const = 0;//нереализованный виртуальный метода
};
class Ellipse : public BaseEllipse//класс эллипс
{
private:
double a;//главная полуось
double b;//малая полуось
double angle;//угол ориентации в градусах
public:
double Area() const {return M_PI*a*b;}
};
class Circle: public BaseEllipse//круг
{
private:
double r;//радиус
public:
double Area() const {return M_PI*r*r;}
};
Для любого класса необходим свой конструктор, в 1-м случае – 5 параметров, во 2-м - 3.
Дата добавления: 2016-05-26; просмотров: 1443;