Программирование >>  Расширенная версия языка c++ 

1 ... 117 118 119 [ 120 ] 121 122 123 ... 227


Самоучитель

virtual val() { return x; }

template <class T>

class Squary: public Nimi<T> {

public:

Squary (Ti) : Nijm<T>(i) {}

Т get val() { return x; }

template <class T>

class Sqr root: public Num<T> { public:

Sqr root(T i): Num<T>(i) {}

T get val() { return sqrt ( (double) x) ;

Фабрика производных от класса Hini объектов Num<double> * generator О

switch (rand О % 2) {

case 0: return ne le> (rand() % 100);

case 1: return new Sqr root<double> (rand() % 100),

return NULL;

int {

Num<double> оЫ (10), *pl; Squary<double> ob2(100.0); Sqr root<double> оЬЗ(999.2)

int i;

cout endl;

cout endl;

cout endl;

if(typeid(ob2) == typeid (Squary<double>))

cout is

pi = fiob2;

if (typeid(*pl) ! = typeid(obi))

cou Значение равное >qet val (} ;

cout \n\n ,-

:. /1

cou Теперь генерируем объекты\п ; for(i=0; i<10; i++) {

pi tor{); получение слеющего объекта



if(typsid(*pl) == typeid(Squary<double>))

cou Кваат объекта: ; d(*pl) = oot<doi.ible>) )

cou Квадратный корень объекта: ;

cou Значение равно:

cou endl;

pl->get val(),

return 0;

Программа выводит на экран следующее:

class Nlum<double> class Squary<double>

class Sqr root<double> is Squary<double>

Значение равно: 10000 Теперь генерируем объекты Квадратный корень объекта

Квадрат объекта: Значение

Квадратный корень объекта

Квадрат объекта: Значение Квадрат объекта: Значение

Квадратный корень объекта Квадратный корень объекта Квадратный корень объекта; Квадрагныи корень объекта: Квадратный корень объекта

; Значение равно :

Значение равно: равно: 33 64

равно: 4096

Значение равно:

Значение равно:

Значение равно:

Значение равно:

Значение равно:

8,18535 4.89898

6.7082

5. 19616 9.53939

6. 48074

IV

lyripaiifHeHiil

.. ,1 у- , , . , .f . , .г }

1. Зачем нужна динамическая идентификация типа?

2. Проведите эксперимент, о котором говорилось в примере 1. Что вы увидите на экране?

3. Правилен ующий фрагмент программы?

cout << typeid (float) .name О ;

4. Дан фрагмент программы. Как определить, является ли р указателем на объект типа D2?

class В {

virtual void f() U



368 Самоучитель С++ /

class Dl; public В ( O-p * . . , /

void f () {} . . : V

b- .

class D2: public В { .

void f 0 (}

int mainO .

В *p;

5. По отношению к классу Num из примера 5 следующее выражение является истинным или ложным? , . .

typeid(Num<int>) == typeid(Num<double>)

6. Поэкспериментируйте ШТ]. Хотя польза от динамической идентификации типа в контексте приведенных здесь простых примеров может показаться не слишком очевидной, тем не менее это мощный инструмент упраатения объектами во время работы программы.

12.2. Оператор dynamicjcast

Хотя в C++ продолжают поддерживаться характерные для языка С операторы приведения типов, имеется и несколько новых. Это операторы dy-namic cast, const cast, reinterpret cast и static cast. Поскольку оператор dynamJC cast имеет непосредственное отношение к динамической идентификации типа, мы рассмотрим его первым. Остальные операторы приведения типов рассматриваются в следующем разделе.

Оператор реализует приведение типов в динамическом режиме,

что позволяет контролировать правильность этой операции во время работы программы. Если при выполнении оператора dynamicjcast приведения типов не произошло, будет выдана ошибка приведения типов. Ниже представлена основная форма оператора dynaiiuc cast: ,

dynamic са8Ь<цвлв!аой !И1о> (внражешхв)

Здесь тй тип - это тип, которым должен стать тип параметра выражение после выполнения операции приведения типов. Целевой тип должен быть типом указателя или ссылки и результат выполнения параметра выражение тоже должен стать .указателем или ссылкой. Таким образом, оператор dyiiaiiiic cast используется для приведения типа одного указателя к типу другого или типа одной ссылки к типу другой.

Основное назначение оператора заключается в реализации

операции приведения полиморфных типов. Например, пусть дано два поли-



1 ... 117 118 119 [ 120 ] 121 122 123 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика