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

Void my_terminate()

{

cout<<”program aborted””<<endl;

abort();

}

Int main()

{

set_terminate(my_terminate);

try{

cout<<”generate exception int”<<endl;

throw 1;

}catch(double i)

{

cout << ”exception(double)”<<end;

}

return 0;

}

Функция unexpected()

void unexpected()

Особенности:

  • вызывается автоматически при попытке сгенерировать исключительную ситуацию, не указанную в разделе throw

  • по умолчанию вызывает функцию terminate()

  • можно изменить обработчик функции, используя

unexpected_handler set_unexpected ( unexpected_handler newhandler ) throw ()

Однако он должен заканчиваться вызовом terminate()

/* Пример перегрузки аналогичен примеру перегрузки функции terminate() */

2.24

В С++ для поддержки динамического полиморфизма используются :

  • динамическая идентификация типа RTTI ( run-time type specification ) - позволяет идентифицировать тип объекта при выполнении программы

  • дополнительные операторы приведения типов - обеспечивают более безопасный способ приведения типов

Динамическая идентификация типа добавлена в связи с неободимостью определения типов объектов при выполнении программы.

Такая ситуация возникает при реализации полиморфизма с помощью иерархий класов, вирутальных функций. указателей на базовые классы.

Оператор typeid.

Для идентификации типа предназначен оператор

typeid ( object );

typeid ( type );

Особенности:

  • определен в заголовке <typeinfo>

  • object - объект, для которого выполняется ижентификация типа

  • type - тип, для которого требуется получить описание

  • оператор возвращает const type_info& - константную ссылку на объект типа type_info

Класс type_info.

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

class type_info {

public:

virtual ~type_info();

int operator ==(const type_info& rhs) const;

int operator !=(const type_info& rhs) const;

Int before (const type_info& rhs) const;

const char* name () const ;

const char* raw_name () const;

private:

...

};

  • operator ==() и operator !=() предназначены для сравнения типов

  • before () - возвращает true , если параметр метода расположен после текущего типа объекта в списке описаний типов ( не имеет никакого отношения к иерархии классов )

  • name () - возвращает строку читаемого описания имени типа

  • raw_name () - возвращает строку сжатого описания мени типа

Динамическая идентификация типов с помощью typeid.

Выполняется, если оператор typeid применяется к указателю на базовый класс.

Особенности:

  • тип реального объекта определяется во время выполнения программы, если оператор применяется к указателю на объект полиморфного базового класса

  • полиморфный класс - класс с хотя бы одной виртуальной функцией

  • если указатель будет нулевым, то оператор сгенерирует исключение bad_typeid

  • для неполиморфных классов динамическая идентификация типов невыполнима

#include <iostream>

#include <typeinfo>

using namespace std:

// Non-polymorphical

class B {

public : void show() { cout << " B"; }

};

class D1: public B {

public: void show () { cout << "D1";}

};

class D2: public B{

public: void show () { cout << "D2";}

};

class D11:public D1{

public: void show () { cout << "D11";}

};

// Polymorphical

class BP {

public: virtual void show () { cout << "BP";}

};

class DP1: public BP{

public : void show() { cout << "DP1"; }

};

class DP2 : public BP{

public : void show() { coit << " DP2";}

};

class DP11 : public DP1{

public: void show( ){ cout << " DP11"; }

};

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