
- •Базовые принципы объектно-ориентированного программирования.
- •Базовые конструкции объектно-ориентированных программ.
- •Конструктор и деструктор. Конструктор по умолчанию.
- •Конструктор копирования.
- •Конструктор explicit.
- •Указатель this.
- •Абстрактные типы данных.
- •Операторы для динамического выделения и освобождения памяти (new и delete).
- •Перегрузка и переопределение функций.
- •Перегрузка бинарных операторов.
- •Перегрузка унарных операторов.
- •19.20.Перегрузка оператора new.Перегрузка оператора delete.
- •22.Inline-функции.
- •23.Вложенные классы
- •24.Static-компоненты данные класса
- •25.26.Static и const-компоненты функции класса
- •27.Использование new delete для реализации массивов
- •28.Организация внешнего доступа к локальным компонентам класса(friend)
- •29.Ссылки.Параметры ссылки
- •30.Ссылки.Независимые ссылки
- •31.Инициализация компонент-данных объекта. Конструктор с параметрами.
- •33.Наследование. Открытое, защищенное и закрытое.
- •34.Виртуальные функции.
- •35.Множественное наследование.
- •36.Множественное наследование и виртуальные базовые классы
- •38.Proxi-классы.
- •39.40.Пространство имен. Пространство имен как объявление. Пространство имен как директива.
- •41.Виртуальные функции
- •42.Параметризированные классы (шаблоны).
- •43.Шаблоны функций.
- •44.Передача в шаблон класса дополнительных параметров.
- •44.Совместное использование шаблонов и наследования.
- •45.Шаблоны класса и friend.
- •46.Реализация smart-указателя.
- •48.Транзакции.
41.Виртуальные функции
Виртуальные деструкторы необходимы при использовании указателей на базовый класс при выделении памяти под динамически создаваемые объекты производных классов. Это обусловлено тем, что если объект уничтожается явно, например, используя операцию delete, то вызывается деструктор только класса, совпадающего с типом указателя на уничтожаемый объект. При этом не учитывается тип объекта, на который указывает данный указатель. В случае объявления деструктора базового класса виртуальным, все деструкторы производных классов становятся также виртуальными. При этом если будет выполняться явное уничтожение объекта производного класса для указателя на базовый класс, то вначале вызывается деструктор производного класса,
а затем вверх по иерархии до деструктора базового класса.
class Shape
{protected:
double 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();
};
void Circle::area()
{ s=r*r*3.14; cout<<" Площадь круга = "; this->print();
}
int main()
{ Shape *fg1;
fg1=new Circle("("Круг ",2); fg1->area(); delete fg1; return 0;
}
В случае если деструктор базового класса не являлся бы виртуальным, то
при удалении объектов производных классов осуществлялся бы вызов только
деструктора класса соответствующего ему типа , т.е. базового класса (класса,
для которого объявлен соответствующий указатель).
Если в классе имеются виртуальные функции, то желательно объявлять
деструктор этого класса также виртуальным, даже если этого не требуется. Это
может предотвратить возможные ошибки.
42.Параметризированные классы (шаблоны).
template <class T1, class T2>
class A
{
T1 i;
T2 j;
public:
A(T1 a, T2 b) {i=a;j=b;}
void show() {cout<<i<<' '<<j<<endl;}
};
int main()
{
A <int,double> ob1(10,0.23);
A <char,char*> ob2('q',"qwert");
ob1.show();
ob2.show();
return 0;
}
43.Шаблоны функций.
Функция, вычисляющей сумму нескольких аргументов.
#include <iostream>
using namespace std;
#include <string.h>
template <class T1,class T2>
T1 sm(T1 a,T2 b) // описание шаблона
{ return (T1)(a+b); // функции c двумя параметрами
}
template <class T1,class T2,class T3>
T1 sm(T1 a,T2 b,T3 c) // описание шаблона функции
{ return (T1)(a+b+c); // функции c тремя параметрами
}
int main()
{cout<<"вызов функции sm(int,int) = "<<sm(4,6)<<endl;
cout<<"вызов функции sm(int,int,int) = "<<sm(4,6,1)<<endl;
cout<<"вызов функции sm(int,double) = "<<sm(5,3)<<endl;
cout<<"вызов функции sm(double,int,short)= " <<
sm(.4,6,(short)1)<<endl;
// cout<<sm("я изучаю","язык С++")<<endl; error cannot add two pointers
return 0;
}