Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы Осадчий А.В. гр.010902.docx
Скачиваний:
6
Добавлен:
24.04.2019
Размер:
143.34 Кб
Скачать

36. Статическое и динамическое связывание

Статическая область памяти — это область памяти, размер которой известен на этапе компиляции.

Поскольку для статической области памяти известен ее размер, компилятор всегда может выделить эту область памяти и связать ее с соответствующим элементом программы. Поэтому для статической области памяти компилятор порождает некоторый адрес (как правило, это относительный адрес в программе). Статические области памяти обрабатываются компилятором самым простейшим образом, поскольку напрямую связаны со своим адресом. В этом случае говорят о статическом связывании области памяти и лексической единицы входного языка.

Динамическая область памяти — это область памяти, размер которой на этапе компиляции программы не известен.

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

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

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

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

#include "iostream.h"

#include "iomanip.h"

#include "string.h"

class Shape // базовый класс

{protected:

float s; // площадь фигуры

public:

Shape(char *fig) : s(0)

{ cout << "конструктор класса Shape (фигура "<< fig <<')'<< endl;}

virtual ~Shape()

{ cout << "деструктор класса Shape" << endl;}

void virtual print()

{cout<<s<<endl;}

void virtual area()=0;

};

class Circle : public Shape // производный класс Круг

{ int r;

public:

Circle(char *name,int r): Shape(name)

{ cout << "конструктор класса Circle "<<endl;

this->r=r;

}

~Circle()

{ cout << "деструктор класса Circle " << endl;}

void area();

}; и тд.

Результатом работы программы будет:

конструктор класса Shape (фигура Circle)

конструктор класса Circle

конструктор класса Shape (фигура Bar)

конструктор класса Bar

площадь круга

площадь прямоугольника

деструктор класса Circle

деструктор класса Shape

деструктор класса Bar

деструктор класса Shape