- •Void init (int aa,bb,int cc){
- •Void show()
- •Int main()
- •Int getx() {return X;}
- •Void my_terminate()
- •Int main()
- •Int before (const type_info& rhs) const;
- •Int main(){
- •Void fun ( figure & f ){
- •Int main (){
- •Int main(){
- •Void f1 ( const int * a ){
- •Void f2 ( const int& a){
- •Int main () {
- •Int main(){
- •Int main (){
- •Int main(){
- •Int main(){
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;
