Деструктор – антипод конструктора, который вызывается автоматически при разрушении объекта
Имя деструктора совпадает с именем конструктора, но перед ним ставится знак (тильда)
Объявление деструктора
Деструкторы по умолчанию являются открытыми
При объявлении деструкторов действуют несколько правил:
Не могут иметь аргументов
Не могут иметь возвращаемого типа (включая void )
Не могут возвращать значение с помощью оператора return
Не могут объявляться как const , volatile или static . Однако их можно вызывать для уничтожения объектов, объявленных как const , volatile или static
Использование деструкторов
Деструкторы вызываются, когда происходит одно из следующих событий:
Объект, предоставленный с использованием оператора new , можно явно освободить с использованием оператора delete
Локальный (автоматический) объект с областью видимости "блок" выходит за пределы области видимости
Время существования временного объекта заканчивается
Программа заканчивается, глобальные или статические объекты продолжают существовать
Деструктор можно явно вызывать
имя объекта. ~ имя деструктора ()
Ограничения на использование деструкторов:
Невозможно взять адрес деструктора
Производные классы не наследуют деструкторы базового класса
a; ~Int(){ cout Int Ob1, Ob2(a), Ob3; // инициализация первым конструктором Ob1.show(); void setX(int a); void show(); Ob2.show(); int summa(Int obj1, Int obj2) { Ob3.show(); return obj1.x+obj2.x;} }; Ob3.setX(Ob3.summa(Ob1,Ob2)); Ob3.show(); Ob3.~Int(); void Int::show(){cout void Int::setX(int a){x=a;} system("pause"); }" width="640"
#include "iostream"
#include "stdlib.h"
void main()
using namespace std;
class Int {
{
int a;
int x;
cout
public:
Int(int y=0){x=y;}
cin a;
~Int(){
cout
Int Ob1, Ob2(a), Ob3; // инициализация первым конструктором
Ob1.show();
void setX(int a);
void show();
Ob2.show();
int summa(Int obj1, Int obj2) {
Ob3.show();
return obj1.x+obj2.x;}
};
Ob3.setX(Ob3.summa(Ob1,Ob2));
Ob3.show();
Ob3.~Int();
void Int::show(){cout
void Int::setX(int a){x=a;}
system("pause");
}
Полиморфизм
Виртуальные методы - это один из важнейших приёмов реализации полиморфизма . Они позволяют создавать общий код, который может работать как с объектами базового класса, так и с объектами любого его класса-наследника. При этом базовый класс определяет наличие способа работы с объектами, а любые его наследники могут предоставлять конкретную реализацию этого способа.
Важнейшая концепция ООП
Полиморфизм – важнейшая концепция в ООП. Большинство лучших практик и решений основаны на полиморфизме и глубокое понимание принципов и тонкостей работы данного механизма является обязательным для построения гибкой и надёжной архитектуры ПО!
Определение
Полиморфизм – это принцип, согласно которому есть возможность использовать одну и ту же запись для работы с объектами различных типов данных. Кратко: « один интерфейс, множество реализаций ». Полиморфизм позволяет единообразно работать с объектами различных типов, подменяя только сами объекты, но не код по их обработке.
Drive();" width="640"
Полиморфная строка кода
for ( int i = 0; i
traffic[i]-Drive();
Виды полиморфизма
В узком смысле полиморфизм разделяют на статический и динамический . Однако, в большинстве ситуаций под полиморфизмом понимают именно динамический полиморфизм.
Статический полиморфизм – это механизм, при котором одна и та же инструкция может быть использована для работы с объектами разных типов, но конкретный тип и инструкции по работе с ним уже известны на этапе компиляции!
Статический полиморфизм
Ad-hoc полиморфизм . Реализуется через механизм перегрузки методов – эта тема вам уже хорошо знакома.
Параметрический полиморфизм . Реализуется через механизм обобщений (g e nerics, дж е нериков) – с этим будем разбираться после темы «интерфейсы».
Динамический полиморфизм
Динамический полиморфизм – это механизм, при котором одна и та же инструкция может быть использована для работы с объектами разных типов, но конкретный тип и инструкции по работе с ним НЕ известны на этапе компиляции, а определяются на этапе выполнения (реализуется т.н. полиморфное поведение).