Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KPIYaP_OTVET_2.rtf
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
95 Кб
Скачать

Int main(){

try{

B *b; D1 d1; D2 d2; D11 d11;

b = &d1; b->show(); cout << typeid (*b).name();

b = &d2; b->show(); cout << typeid(*b).name();

b = &d11; b->show(); cout << typeid(*b).name();

b = 0; cout << typeid(*b).name();

}catch( bad_typeid ) { cout << " object is NULL ";}

try{

BP *bp; DP1 dp1; DP2 dp2; DP11 dp11;

bp = &dp1; bp->show(); cout << typeid(*bp).name();

bp = &dp2; bp->show(); cout << typeid(*bp).name();

bp = &dp11; bp->show(); cout << typeid(*bp).name();

bp = 0; cout << typeid(*bp).name();

}catch ( bad_typeid ) { cout << " object is NULL "; }

return 0;

}

// ===================

Output:

B class B

B class B

B class B

class B

DP1 class DP1

DP2 class DP2

DP11 class DP11

object is NULL

// ====================

Динамическая идентификация с помощью ссылок.

Динамическая идентификация типа также выполняется, если оператор typeid применяется к ссылке на базовый класс.

Особенности:

  • тип реального объекта определяется во время выполнения программы, если оператор применяется к ссылке на объект полиморфного базового класса

  • чаще всего данный вариант примеяется для проверки параметров, передаваемых в функцию с помощью ссылок

  • для неполиморфных классов динамическая идентификация с помощью ссылок не выполнима

#include <iostream>

#include <typeonfo>

using namespace std;

class figure

{

public: void show() {cout<<”object”;}

};

class circle : public figure

{

public: void show() {cout<<”circle”;}

};

class triangle : public figure

{

public: void show() {cout<<”triangle”;}

};

class rectangle : public figure

{

public: void show() {cout<<”rectangle”;}

};

Void fun ( figure & f ){

try{

f.show();

if ( typeid(f) == typeid(circle)) cout << " circle ";

if ( typeid(f) == typeid(triangle)) cout << "triangle";

if (typeid(f) == typeid(rectangle)) cout << "rectangle";

} catch( bad_typeid) { }

}

Int main (){

rectangle r; triangle t; cicle c;

fun ( c );

fun ( r );

fun ( t );

return 0;

}

2.25

Оператор typeid может применяться к шаблонным классам.

Особенности :

  • тип объекта определяется также тем, какие данные используются в качестве шаблонных параметров при создании конкретного объекта

  • если для одного и того же шаблонного класса типы параметров не совпадают, то типы классов считаются разными

#include <iostream>

#include <typeinfo>

using namespace std;

template < class T1, class T2>

class myclass{

T1 a; T2 b;

public:

};

template < class T1, class T2, class T3, class T4>

void compare ( myclass <T1, T2> & c1, myclass <T3, T4> &c2){

if (typeid ( c1 ) == typeid ( c2)) {

cout << " objects have one type " ;

}else {

cout << " object have different types";

}

}

Int main(){

myclass <int, double> o1, o2;

myclass <double, int> o3;

myclass < int, int> o4;

compare (o1, o2);

compare ( o1, o3)

compare( o1, o4);

compare (o2, o3);

compare( o2, o4);

return 0;

}

2.26

Операторы приведения типов.

В С++ существуют следующий операторы приведения типов:

  • стандартный оператор - ( тип ) выражение

  • const_cast

  • reinterpreted_cast

  • static_cast

  • dynamic_cast

Оператор const_cast.

const_cast < type > ( expr )

Особенности:

  • используется для явного замещения модификаторов const ( немодифицируемый объект ) и volatile ( объект может менятся неявно ) для указателей и ссылок

  • результирующий тип должен совпадать с исходным за исключением const и volatile

  • НЕЛЬЗЯ напрямую снять модификатор const с переменной

  • в основном используется для работы с аргументами фукнций

  • не рекомендуется к использованию ( не безопасен )

  • expr - исходное выражение

  • type - результирующий тип

#include < iostream >

using namespace std;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]