Преимущества позднего связывания

В С++ преимущество различной реакции объекта на сообщение можно получить в полиморфическом кластере. Можно создать коллекцию ссылок или указателей на объекты. Эти ссылки(указатели) должны быть объявлены как ссылки или указатели на объекты базового класса или одного из производных классов в полиморфическом кластере. Любая попытка загрузить указатель или ссылку на объект, не входящий в полиморфический кластер, закончится неудачей (компилятор выдаст сообщение о несоответствии типов). Ссылки и указатели на объекты базового класса совместимы только с ссылками или указателями на объекты public-производного класса.

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

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

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

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

Использование виртуальных деструкторов позволяет обеспечить вызов соответствующего дестрктора при разрушении об’ектов оператором delete, даже если тип разрушаемого об’екта неизвестен на стадии компиляции..

class Figure {

public:

Figure();

virtual ~Figure();

};

typedef Figure *PFigure;

class Circle:public Figure {

public:

Circle(int centerx, int centery,int radius);

virtual ~Circle();

};

class Rectangle:public Figure {

public:

Rectangle(int left, int top, int right, int bottom);

~Rectangle();

};

int main();

{

const ALLFigures = 2;

PFigures figures[ALLFigures];

figures[0]=new Circle(100,100,10); // массив указателей на фигуры

figures[1]=new Rectangle(100,100,200,300);

for(int count=0; count<ALLFigures; count++)

delete figures[count]; // уничтожение массива

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: