Здавалка
Главная | Обратная связь

Динамічна ідентифікація типів.



Динамічна ідентифікація типу характерна для мов, у яких підтримується поліморфізм. У цих мовах можливі ситуації, у яких тип об'єкта на етапі компіляції невідомий.

У С++ поліморфізм підтримується через ієрархії класів, віртуальні функції і покажчики базових класів. При цьому покажчик базового класу може використовуватися або для вказівки на об'єкт базового класу, або для вказівки на об'єкт будь-якого класу похідного від цього базового.

Нехай група містить об'єкти різних класів і необхідно виконати деякі дії тільки для об'єктів визначеного класу. Тоді в ітераторі ми повинні розпізнавати тип чергового об'єкта.

У стандарт мови С++ включені засоби RTTI(Run-Time Type Idendification)- динамічна ідентифікація типів. Ці засоби реалізовані в останніх системах Borland C++ (версій 4.0 і вище).

Інформацію про тип об'єкта одержують за допомогою оператора typeid, визначення якого містить заголовний файл <typeinfo.h>.

Є дві форми оператора typeid:

typeid (об'єкт)

typeid (ім'я_типу)

Оператор typeid повертає посилання на об'єкт типу type_info.

У класі type_info перевантажені операції == і != забезпечують порівняння типів.

Функція name() повертає покажчик на ім'я типу.

Є одне обмеження. Оператор typeid працює коректно тільки з об'єктами, у яких визначені віртуальні функції. Більшість об'єктів мають віртуальні функції, хоча б тому, що звичайно деструктор є віртуальним для усунення потенційних проблем з похідними класами. Коли оператор typeid застосовують до неполіморфного класу (у класі немає віртуальної функції), які одержують покажчик чи посилання базового типу.

Приклади.

1.

#include<iostream.h>

#include<typeinfo.h>

class Base{

virtual void f(){};

//…

};

class Derived: public Base{

//…

};

void main()

{int i;

Base ob,*p;

Derived ob1;

cout<<typeid(i).name(); //Виводиться int

p=&ob1;

cout<<typeid(*p).name(); // Виводиться Derived

}

2.

//початок див. вище

void WhatType(Base& ob)

{cout<< typeid(ob).name()<<endl;

}

void main()

{

Base ob;

Derived ob1;

WhatType(ob); //Виводиться Base

WhatType(ob1); //Виводиться Derived

}

3.

//початок див. вище

void main()

{

Base *p;

Derived ob;

p=&ob;

if(typeid(*p)==typeid(Derived)) cout<<“p указує на об'єкт типу Derived”;

}

Якщо при звертанні typeid(*p), p=NULL, то збуджується виняткова ситуація bad_typeid

Порядок виконання роботи.

1. Доповнити ієрархію класів лабораторної роботи №2 класами “група”.

Наприклад, для предметної області ФАКУЛЬТЕТ можна запропонувати класи “факультет”, “студентська група”, “кафедра”. Рекомендується створити абстрактний клас - “підрозділ”, що буде предком усіх груп і абстрактний клас TObject, що знаходиться на чолі всієї ієрархії.

2.Написати для класу-групи метод - ітератор.

3.Написати процедуру функції, що виконується для всіх об'єктів, що входять у групу (дивися приклади в додатку).

4.Написати демонстраційну програму, у якій створюються, показуються і руйнуються об'єкти-групи, а також демонструється використання ітератора.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.