Слайд 4
Преобразования типов Синтаксис: 1) тип (выражение); 2) (тип) выражение; Примеры: const char*
p = “asdf”; int i; char* a; 1) i =
p; 2) i = (int)p; 3) i = int(p); 4) a = p; 5) a = (char*)p; 6) a = char*(p);
Слайд 5
const_cast Синтаксис: const_cast (выражение); Выражение: константный указатель Тип: тот же что
и тип выражения но без const Возвращаемое значение: переменую типа
‘тип’ Пример: const char* p = “asdf”; char* a = const_cast(p);
Слайд 6
dynamic_cast 1 Синтаксис: dynamic_cast (выражение); Выражение: указатель или ссылка на
класс Тип: базовый или производный от типа выражения Возвращаемое значение: переменную
типа ‘тип’; при ошибке: 1) ноль (если ‘тип’ – указатель) 2) исключение bad_cast (если ‘тип’ – ссылка) Пример: // Повышающее преобразование (upcast) class B { }; class C : public B { }; C* c = new C(); B* b = dynamic_cast(c);
Слайд 7
dynamic_cast 2 Примеры: // понижающее преобразование (downcast) 1) class A
{ }; class B : public A { }; A* a
= new A(); B* b = dynamic_cast(a);
2) class A { public: virtual void Test() {} }; class B : public A { public: virtual void Test() {} }; A* a = new A(); B* b = dynamic_cast(a);
Слайд 8
dynamic_cast 3 Пример: // понижающее преобразование (downcast) #include class B
{ public: virtual void Test(); }; class C : public B {
}; void func(B& b) { try { С& с = dynamic_cast(b); } catch (bad_cast) { } } B* b = new B(); func(*b); // исключение C* c = new C(); func(*c);
Слайд 9
dynamic_cast 4 Пример: // перекрёстное преобразование (crosscast) class A { public:
virtual void Test() {} }; class B : public A { }; class
C : public A { }; void func(C* c) { B* b = dynamic_cast(c); } B* b = new B(); func((C*)b);
Слайд 10
dynamic_cast 5 Пример: // перекрёстное преобразование (crosscast) class B { public:
virtual void Test1() {} }; class C { public: virtual void Test2()
{} }; class D : public B, public C { }; void func(B* b) { C* c = dynamic_cast(b); } D* d = new D(); func(dynamic_cast(d));