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

1 ... 115 116 117 [ 118 ] 119 120 121 ... 227


.360 , Самоучитель C++

class BaseClass {

virtual void f() (}; делаем класс BaseClass полорфн H ...

class Derivedl: public BaseClass {

/; ...

class public BaseClass {

{

; int i; . .i L:Ui 1tt!t-

BaseClass *p, baseob; ... iri -y-.

Derivedl оЫ;

Derived2

. J. . .

.J ~uOii-..\ :.

г r,-.: : ii r - Г ->:

Вывод на экран встроенного типа данных cout Тип переменной i - это ;

cout

Обработка полорфн1х типов i.i*-- .

р = ibaseob;

cout Указатель р указывает на объект типа ; cout typeid (*р) .name о endl; .

р = &obl; : :;: . ., ..

cout Указатель р указывает на объект типа ; .

cout typeid (*р) .nameO endl; . ,

р = £ОЬ2; ... . . i, . . -..Т

cout Указатель р указывает на объект типа ; .

cout typeid{*р) .namef) endl;

return 0;

Программа выводит на экран следующую информацию: Тип переменной i - это int

Указатель р указывает на объект типа BaseClass

Указатель р указывает на объект типа Derivedl ч.- *

Указатель р указывает на объект типа Derived2

Как уже отмечалось, когда в качестве аргумента оператора typeid задан указатель полиморфного базового класса, реальный тип объекта, на который указывает указатель определяется во время выполнения программы, что очевидно по выводимой на экран информации. В качестве эксперимента за-



WhatType (baseob) WhatType (obi)

WhatType (оЬ2)

return 0; ктчу: . . и.i :, . --i-l-

комментируйте виртуальную функцию f() в определении базового класса и что получится.

2. Ранее уже говорилось, что когда в качестве аргумента оператора typeid указана ссылка полиморфного базового класса, возвращаемым типом будет тип

реального объекта, на который дана ссылка. Чаще всего это свойство используется в ситуациях, когда объекты передаются функциям по ссылке. Например, в следующей программе в объявлении функции WhatType() объект типа BaseCiass задан параметром-ссылкой. Это означает, что функции What-Туре() можно передавать ссылки на объекты типа BaseClass или типов, про-изводнгх от класса Class. Если в операторе typeid задать такой параметр, то он возвратит тип реального объекта.

Использование оператора typeid со ссылкой в качестве аргумента ttinclude <iostream> ttinclude <typeinfo> using namespace std;

class BaseClass { .....

virtual void f() {}; делаем класс BaseClass полиморфным ...

class Derivedl: public BaseClass { ...

class Derived2: public BaseClass {

;/ . ..

Задание ссхлки в качестве параметра функции void WhatType (BaseClass Sob)

cout ob - это ссылка на объект типа ; cout typeid (ob) .name {) endl;

int main()

int i; *

BaseClass baseob; Derivedl ; Derived2 ob2;



362 - .1 i Самоучитель С++

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

ob - это ссылка на объект типа BaseClass

ob - это ссылка на объект типа Derivedl .i;-. . .- . .li.H,

ob - это ссылка на объект типа Derived2 !

3. Хотя получение имени типа объекта в некоторых ситуациях оказывается весьма полезным, часто бывает необходимо соответствуют ли друг

другу типы нескольких объектов. Это легко сделать, зная что объект типа type info, возвращаемый оператором typeid, перегружает операторы == и !=. В представленной ниже программе показано использование этих операторов.

Использование операторов == и != с оператором typeid ftinclude <iostream>

ttinclude <typeinfo> . . i

using namespace std; Ц. , v.-,

class X {

virtual void f() (} .-

class Y {

virtual void f () П

yt - г-и:::л, . :

int mainO

X xl, x2; ! <,

Y yl;

if (typeid(xl) == (typeid(x2))

cou Т объектов xl и х2 одинаков\п ; else . .

cou Т объектов xl и х2 не одинаков \п ;

id{xl) != (typeid(yl))

cou Т объектов xl и yl не одинаков \n ;

else

cou Т объектов xl и yl одинаков\n ; о ,

return 0;

) -

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

Тип объектов xl и х2 одинаков Тип объектов xl и yl не одинаков

4. Хотя в предыдущих примерах и были показаны некоторые приемы работы с оператором type info, главных его достоинств мы не увидели, поскольку типы объектов были известны уже на этапе компиляции программы. В сле-



1 ... 115 116 117 [ 118 ] 119 120 121 ... 227

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