![](/user_photo/2706_HbeT2.jpg)
- •Закрытое наследование
- •Закрытое наследование
- •Композиция или закрытое наследование?
- •Пример
- •Защищенное наследование
- •Пример
- •Вложенные классы
- •Пример
- •Пример
- •Назначение PIMPL
- •Недостатки PIMPL
- •Реализация PIMPL
- •Пример (ComplexClass.h)
- •Основное преимущество
- •Оператор dynamic_cast
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 2 - ссылки
- •Пример 2 - ссылки
![](/html/2706/1201/html_AsoEk82AoW.71dX/htmlconvd-2ObbEb28x1.jpg)
Оператор dynamic_cast
Оператор приведения типа dynamic_cast позволяет выполнить безопасное приведение ссылки или указателя на один типданных кдругому
◦Проверкадопустимостиприведениятипа осуществляетсявовремяработыпрограммы
◦Вслучаенекорректного приведениябудет возвращенNULL (вслучаеприведения указателей)иливыброшеноисключение std::bad_cast (приприведенииссылок)
dynamic_castиспользуетRTTI,т.е.
нуженхотябы1виртуальныйметод
![](/html/2706/1201/html_AsoEk82AoW.71dX/htmlconvd-2ObbEb29x1.jpg)
Пример 1 - указатели
class Animal
{
public:
virtual ~Animal() {} };
class Bird
: public Animal {};
class Eagle
: public Bird {};
![](/html/2706/1201/html_AsoEk82AoW.71dX/htmlconvd-2ObbEb30x1.jpg)
Пример 1 - указатели
class Mammal
: public Animal {};
class Cat
: public Mammal {};
class Rabbit
: public Mammal {};
![](/html/2706/1201/html_AsoEk82AoW.71dX/htmlconvd-2ObbEb31x1.jpg)
Пример 1 - указатели
void PrintAnimalType(Animal const * pAnimal)
{
if (dynamic_cast<Rabbit const*>(pAnimal) != NULL) std::cout << "Rabbit\n";
else if (dynamic_cast<Cat const*>(pAnimal) != NULL) std::cout << "Cat\n";
else if (dynamic_cast<Eagle const*>(pAnimal) != NULL) std::cout << "Eagle\n";
else if (dynamic_cast<Mammal const*>(pAnimal) != NULL) std::cout << "Some unknown type of mammals\n";
else if (dynamic_cast<Bird const*>(pAnimal) != NULL) std::cout << "Some unknown type birds\n";
else
std::cout << "Some unknown type of animals\n";
}