Лекция №1. Неизвестные типы и пространство неизвестных имен. Динамическое определение типов. Операторы переключения типов. Создание пространства новых имен. Буферизированный вход и выход


Пример использования оператора typeid() для объектов классов, образующих иерархию


Download 36.96 Kb.
bet3/8
Sana25.02.2023
Hajmi36.96 Kb.
#1229591
TuriЛекция
1   2   3   4   5   6   7   8
Bog'liq
Лекция №1 (1)

2.1.2. Пример использования оператора typeid() для объектов классов, образующих иерархию.
Оператор typeid() полезен в случае когда классы образуют иерархию и в классах реализованы виртуальные функции. В нижеследующем примере объявляется базовый класс Area и два производных класса Circle и Rectangle. Все 3 класса содержат реализацию виртуальной функции GetArea(), которая возвращает разные значения площади в зависимости от выбранной фигуры.
В демонстрационных целях реализована функция Demo_ref_typeid(), которая получает ссылку на базовый класс Area. В функции вызывается оператор typeid(), который определяет тип экземпляра, передаваемого в функцию. Тип экземпляра зависит от того, какой экземпляр по иерархии классов был передан при вызове функции Demo_ref_typeid().
В функции main() демонстрируется использование оператора typeid() для объектов классов и передачу его в функцию Demo_ref_typeid().
#include
#include
using namespace std;
// Применение typeid к иерархии классов
// полиморфный класс Area - площадь
class Area
{
public:
virtual double GetArea() { return 0; }; // виртуальная функция
};
// класс окружность
class Circle :public Area
{
double r;
public:
Circle(double _r)
{
if (_r > 0)
r = _r;
else
r = 1;
}
double GetArea()
{
const double pi = 3.1415;
return pi * r * r;
}
};
// класс прямоугольник
class Rectangle :public Area
{
double a, b;
public:
Rectangle(double _a, double _b)
{
if ((_a >= 0) && (_b >= 0))
{
a = _a; b = _b;
}
else
{
a = b = 0.0;
} }
double GetArea()
{
return a * b;
}
};
// Передача в метод ссылки на базовый класс
// если класс полиморфный, то тип ссылки определяется типом параметра-объекта
void Demo_ref_typeid(Area& ref)
{
cout << "The type of ref is: ";
cout << typeid(ref).name() << endl;
}
void main(void)
{
Area* p; // указатель на базовый класс
Area a;
Circle c(3);
Rectangle r(7, 5);
// так нельзя, неинициализированное значение p
// cout << typeid(*p).name() << endl;
p = &a;
cout << "Pointer p points to object of type: ";
cout << typeid(*p).name() << endl; // class Area
p = &c;
cout << "Pointer p points to object of type: ";
cout << typeid(*p).name() << endl; // class Circle
p = &r;
cout << "Pointer p points to object of type: ";
cout << typeid(*p).name() << endl; // class Rectangle
// Важно: если забрать слово virtual в классе Area,
// то выведет следующий результат:
// Pointer p points to object of type: class Area
// Pointer p points to object of type: class Area
// Pointer p points to object of type: class Area
// Демонстрация использования typeid для ссылок
Demo_ref_typeid(a); // The type of ref is: class Area
Demo_ref_typeid(c); // The type of ref is: class Circle
Demo_ref_typeid(r); // The type of ref is: class Rectangle
}
Если в вышеприведенном коде метод Demo_ref_typeid() будет получать ссылку на базовый класс, в котором не поддерживается полиморфизм (нет цепочки виртуальных функций), то будет получаться тип базового класса Area.
Реализация функции Demo_ref_typeid() получает параметр-ссылку на базовый класс Area&. Такой же результат может быть достигнут при получении параметра указателя на базовый класс Area*.
После запуска программа выдаст следующий результат
Pointer p points to object of type: class Area
Pointer p points to object of type: class Circle
Pointer p points to object of type: class Rectangle
The type of ref is: class Area
The type of ref is: class Circle
The type of ref is: class Rectangle

Download 36.96 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling