
- •Void init (int aa,bb,int cc){
- •Void show()
- •Int main()
- •Int getx() {return X;}
- •Void my_terminate()
- •Int main()
- •Int before (const type_info& rhs) const;
- •Int main(){
- •Void fun ( figure & f ){
- •Int main (){
- •Int main(){
- •Void f1 ( const int * a ){
- •Void f2 ( const int& a){
- •Int main () {
- •Int main(){
- •Int main (){
- •Int main(){
- •Int main(){
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"; }
};