
Лабораторна робота 5
Тема: Простори імен. Операції перетворення типів static_cast<>, const>cast, reinterepret_cast<>, dynamic_cast<>. Операція RTTI typeid().
Контрольні запитання:
Мета створення та використання просторів імен.
Як створити простір імен? У якій точці програми можна визначити простір імен?
Що можна розмістити у просторі імен?
Як отримати доступ до імен простору імен?
Які імена називають некваліфікованими? Кваліфікованими?
Неіменовані простори імен. Особливості оголошення та використання.
Using –оголошення. Призначення.
Як працює using-оголошення, розміщене на локальному рівні? На глобальному рівні?
Наведіть приклад застосування using-оголошення у класах.
Порівняйте using-оголошення та using- директиву.
Як працює using-директива, розміщена на локальному рівні? На глобальному рівні?
Призначення бібліотеки RTTI.
Основні елементи RTTI.
Які операції перевантажені для класу typeinfo?
Що буде виведено на екран?
class Base {
public:
virtual void vvfunc() {}
};
class Derived : public Base {};
using namespace std;
int main() {
Derived* pd = new Derived;
Base* pb = pd;
cout << typeid( pb ).name() << endl;
cout << typeid( *pb ).name() << endl
cout << typeid( pd ).name() << endl;
cout << typeid( *pd ).name() << endl;
delete pd;
}
Операція dynamic_cast < >. Синтаксис. Можливість використання.
Поясніть результат роботи фрагмента коду:
class B {virtual void f();};
class D : public B {virtual void f();};
void f() {
B* pb = new D;
B* pb2 = new B;
D* pd = dynamic_cast<D*>(pb);
D* pd2 = dynamic_cast<D*>(pb2);
}
Призначення операції static_cast<>.
Призначення операції const_cast<>.
Призначення операції reinterepret_cast<>.
Протестуйте роботу функції f() для різних вказівників(B*, D*). Результати програми поясніть.
class B {
public:
virtual void Test(){}
};
class D : public B {};
void f(B* pb) {
D* pd1 = dynamic_cast<D*>(pb);
D* pd2 = static_cast<D*>(pb);
}
Завдання 1. У багатофайловому проекті довільної лаб. роботи розмістити визначення та реалізацію класу у деякому просторі імен.
Завдання 2. Вивести на екран кодову таблицю символів комп’ютера. Скористатися операцією static_cast<>.
Завдання 3. Навести приклад на використання операції const_cast<>.
Завдання 4. Навести приклад на використання операції reinterepret _cast<>.
Варіанти:
Перетворення вказівника у ціле число і навпаки
Перетворення 64-бітного цілого числа у структуру з 4-х коротких цілих(short) елементів і навпаки.
Перетворення 64-бітного беззнакового цілого числа у масив 8 символів і навпаки чи ін.).
Перетворення 64-бітного беззнакового цілого числа у масив беззнакових цілих і навпаки.
Присвоїти деякій цілій змінній адресу цієї ж змінної.
Перетворити структуру у масив символів потрібної довжини.
Завдання 5. Створити ієрархію класів Grandpa-> Daddy-> Son. Клас Grandpa має віртуальну функцію Sleep(). Класи Daddy та Son мають віртуальні функції Walk(). Клас Son має віртуальну функцію Play(). Створити масив вказівників на базовий клас. Визначити глобальну функцію, яка отримує масив вказівників на об’єкти та для кожного об’єкта викликає правильний набір віртуальних методів. Використати операцію dynamic_cast < >.
Завдання (додаткове).
Змінити правила бою у завданні 2 Лаб роботи №1 "Сутичка": кожен боєць (Воїн, Лучник чи Маг) повинен вишукувати серед ворогів суперника свого типу і атакувати його.