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

15. Виртуальные деструкторы и «витруальные» конструкторы. Клонирование.

class employee{} class manager:public employee {int level;} void f(){ employee *p=new manager; delete p;}

Если рассмотреть размер объекта *p, то он будет равен размеру объекта employee, хотя память выделялась для manager.

Class employee{…public: virtual ~employee(){}} – освобождается память размера employee. Т.к. функция виртуальна,то обращение delete *p приводит к удалению того экземпляра объекта, к которому принадлежит p (employee).

При работе с производными классами лучше использовать виртуальные деструкторы.

«Виртуальные конструкторы».

Для того, чтобы создать объект, конструктор должен знать его точный тип. Следовательно, конструктор не м/б виртуальным. Конструктор является не совсем обычной функцией: он взаимодействует с процедурами управления памятью способом, недоступным обычным функциям-членам. Как следствие, вы не можете получить указатель на конструктор.

Оба ограничения можно обойти, определив функцию, которая вызывает конструктор и возвращает созданный объект. Такие функции явл виртуальными, и они (косвенно) создают объекты, их часто наз «виртуальными конструкторами». На самом деле. Каждая просто использует конструктор для создания подходящего объекта.

Пример использования пустой вирт фн, кот вызывает конструктор:

class A {public: A(); virtual A* newObj() {return new A;} class B:public A {public: B(); virtual B* newObj(){ return new B;} main(){ A *p; B *pb; p=new B; A *q=p->newObj(); pa=pb;}

Клонирование – это создание единичной копии объекта не совсем известного типа.

Создадим идентичную копию объекта с пом виртуалььного конструктора.

class C:public B{public: C(); virtual C* NewObj(){return new C;}; virtual C* clone(); private: void copy(B*); A *pa=NewC(p1,p2,…,pN);…;A *pc=pa->clone();

Пример клонирования бинарного дерева: class BinTree {BinTree *left,*right; public: BinTree(); BinTree(BinTree *l, BinTree *r); void copy(BinTree *t); virtual BinTree *clone();}; class BinTreeInfo^public BinTree {Tinfo *info; public: typedef int Tinfo; BinTreeInfo(); BinTreeInfo(BinTreeInfo *l,BinTreeInfo *r,Tinfo *int); void copy(BinTreeInfo *t); virtual BinTreeInfo *clone();}; BinTree *BinTree::clone(){BinTree *tmp; tmp=new BinTree; tmp->left=left; tmp->right=right; if(left) tmp->copy(left); if (right) return tmp;};

16. Посилання. Ініціалізація, використання, порівняння з покажчиками.

Ссылка явл альтернативным именем объекта. Указатель – это перменная, сохраняющая адрес объекта некоторого типа.

При объявлении указателя или ссылки исп символы: * и &. & - операция взятия

адреса. Реализацией ссылки явл константный указатель, при каждом использовании которого происходит разыменование. void f(){int i=1; intr=i; int x=r;//x=1 r=2;// i=2;

Чтобы быть уверенными, что ссылка явл именем чего-нибудь (т.е. привязана к объекту), мы должны инициализировать ее. 1. int &ri=i; 2. class C {int &ri;…public: с(int i); ri(i);…};

Ни один оператор, несмотря на форму записи, не производит действия над ссылкой. Чтобы получить указатель на объект, именем кот явл ссылка ri, мы можем написать &ri.

Использование ссылок. 1. Передача параметров через имена (адрес). Переданный ссылкой аргумент не может быть изменен, т.к. это только копия. Void assign (int i; int value) {i=value;} void main (){int x=0; assign (x,1); cout<<x;//(выдаст 0)}

2. Псевдопеременная – это функция, указатель на которую можно ставить в левой части оператора присваивания. int f(int i); f(3)=2;//Err int &f(int i); f(3)=2;//Ok

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