Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpora_oop.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
258.05 Кб
Скачать

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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]