void set_dim(double i, double j) {

   x = i;

   у = j;

  }

  virtual void show_area() = 0; // чисто виртуальная функция

};

class triangle : public figure {

 public:

  void show_area() {

   cout << "Треугольник с высотой ";

   cout << x << " и основанием " << у;

   cout << " имеет площадь ";

   cout << х * 0.5 * у << ".\n";

  }

};

class rectangle : public figure {

 public:

  void show_area() {

   cout << "Прямоугольник с размерами ";

   cout << x << "x" << у;

   cout << " имеет площадь ";

   cout << x * у << ".\n";

  }

};

class circle : public figure {

 // Отсутствие определения функции show_area()

 // вызовет сообщение об ошибке.

};

int main()

{

 figure *р; // создаем указатель на базовый тип

 triangle t; // создаем объекты производных классов

 rectangle r;

 circle с; // Ошибка: создание этого объекта невозможно!

 р = & t;

 p->set_dim(10.0, 5.0);

 p->show_area();

 р = & r;

 p->set_dim(10.0, 5.0);

 p->show_area();

 return 0;

}

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

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

Сравнение раннего связывания с поздним

При обсуждении объектно-ориентированных языков обычно используются два термина: раннее связывание (early binding) и позднее связывание (late binding). В C++ эти термины связывают с событиями, которые происходят во время компиляции и в период выполнения программы соответственно.

При раннем связывании вызов функции подготавливается во время компиляции, а при позднем — во время выполнения программы.

Раннее связывание означает, что вся информация, необходимая для вызова функции, известна при компиляции программы. Примерами раннего связывания могут служить вызовы стандартных функций и вызовы перегруженных функций (обычных и операторных). Из принципиальных достоинств раннего связывания можно назвать эффективность: оно работает быстрее позднего и часто требует меньших затрат памяти. Его основной недостаток — отсутствие гибкости.

Позднее связывание означает, что точное решение о вызове функции будет принято во время выполнения программы. Позднее связывание в C++ достигается за счет использования виртуальных функций и производных типов. Преимущество позднего связывания состоит в том, что оно обеспечивает большую степень гибкости. Его можно применять для поддержки общего интерфейса и разрешать при этом различным объектам, которые используют этот интерфейс, определять их собственные реализации. Более того, позднее связывание может помочь программисту в создании библиотек классов, характеризующихся многократным использованием и возможностью расширяться. Но к его недостаткам можно отнести, хотя и незначительное, но все же понижение скорости выполнения программ.

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги