![]() |
|
Программирование >> Расширенная версия языка c++
Глав2. Динамическая идентификация и приведение типов ЭбЗ дующем примере этот пробел восполнен. В программе определена простая иерархия классов, предназначенных для рисования на экране разного рода геометрических фигур. На вершине иерархии находится абстрактный класс Shape. Его наследуют четыре класса: Line, Square, Rectangle и NullShape. Функция generator() генерирует объект и возвращает указатель на него. (Функцию, предназначенную для создания объектов, иногда называют фабрикой объектов.) То, какой именно объект создается, определяет генератор случайных чисел rand(). В функции main() реализован вывод получающихся объектов разных типов на экран, исключая объекты типа NulIShape, у которых нет какой бы то ни было формы. Поскольку объекты возникают случайно, заранее неизвестно, какой объект будет создан следующим. Следовательно, для определения типа создаваемых объектов требуется динамическая идентификация типа. Использование операторов - = с оператором typeid tinclude <io5treara> ttinclude <cstdlib> . . . #include <typeinfo> using namespace std; class Shape { public: virtual voi ple(} =0; . . . - ; class Rectangle: public Shape { * publi:- : , ... void example (} { cout *****\n* *\n* *\n*****\n ; ); - class Triangle: public Shape { public: voi ple ( ) { cout >t\n* *\n* *\n*****\n ; , : }. .. ..v:-- .. class Line: public Shape ( public: - voi ple 0 { . - . t - cout * + * + *\n ; с 1 ., . : class NulIShape: public Shape { ; . . public: . -1 . . J r ! w.- *1Ш л;;..:* Фабрика производных от класса Shape объектов Shape *generator() switch(rand О % 4) { case 0: return new Line; case return new Rectangle; case 2; return new Triangle; case 3 : return new NullShape; return NULL; int i; Shape for(i=0; i<10; { ator (); создание слеющего объекта cout typeid (*p) .п-.тгр?! << endl; рисует объект, если он не типа NullShape - if (typeid(*p) != typeid(NullShape)) p->exainple (); return 0; Программа выводит на экран следующее: class Rectangle * + ***** class NullShape class Triangle * * * ***** class Triangle * * * - . . - ***** class Triangle * * *,***.* class Line ***** 5. Оператор eid может работать аблонами. Например, рассмотрим следующую программу. В ней для хранения некоторых значений создается иерархия классов-шаблонов. Виртуальная функция get val() возвращает определенное в каждом классе значение. Для класса Num это значение соответствует самому числу. Для класса Square - это квадрат числа. Для класса Sqr root - это квадратный корень числа. Объекты, производные от класса Num, генерирует функции ator(). С помощью оператора typeid определяется тип генерируемых объектов. Использование агора typeid с шаблонами * include <iostreani> linclude <cstdlib> I ttinclude <cmath ttinclude <typeinfo> using namespace std; template <class T> class Num { public: T x; Num(T i) { X = i; ) class Line + * it * + class Rectangle **** * - : * * . - * *; - ***** class Line ***** class Triangle - , .
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |