Динамічна ідентифікація типів.
Динамічна ідентифікація типу характерна для мов, у яких підтримується поліморфізм. У цих мовах можливі ситуації, у яких тип об'єкта на етапі компіляції невідомий. У С++ поліморфізм підтримується через ієрархії класів, віртуальні функції і покажчики базових класів. При цьому покажчик базового класу може використовуватися або для вказівки на об'єкт базового класу, або для вказівки на об'єкт будь-якого класу похідного від цього базового. Нехай група містить об'єкти різних класів і необхідно виконати деякі дії тільки для об'єктів визначеного класу. Тоді в ітераторі ми повинні розпізнавати тип чергового об'єкта. У стандарт мови С++ включені засоби 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 Все права принадлежат авторам размещенных материалов.
|