Лекция №1. Неизвестные типы и пространство неизвестных имен. Динамическое определение типов. Операторы переключения типов. Создание пространства новых имен. Буферизированный вход и выход
Пример использования оператора typeid() для объектов классов, образующих иерархию
Download 36.96 Kb.
|
Лекция №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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling