- •Закрытое наследование
- •Закрытое наследование
- •Композиция или закрытое наследование?
- •Пример
- •Защищенное наследование
- •Пример
- •Вложенные классы
- •Пример
- •Пример
- •Назначение PIMPL
- •Недостатки PIMPL
- •Реализация PIMPL
- •Пример (ComplexClass.h)
- •Основное преимущество
- •Оператор dynamic_cast
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 2 - ссылки
- •Пример 2 - ссылки
Пример 1 - указатели
int main(int argc, char* argv[])
{
Rabbit rabbit; PrintAnimalType(&rabbit); Animal * pAnimal = new Cat(); PrintAnimalType(pAnimal); delete pAnimal;
return 0;
}
Пример 2 - ссылки
Mammal const& MakeMammal(Animal const& animal){ return dynamic_cast<Mammal const&>(animal);
}
int main(int argc, char* argv[]){ Rabbit rabbit;
Mammal const& rabbitAsMammal = MakeMammal(rabbit);
Cat cat;
// неявное приведение типов вверх по иерархии
Animal const& catAsAnimal = cat;
Mammal const& animalAsMammal = MakeMammal(catAsAnimal);
Пример 2 - ссылки
Eagle eagle; try {
Mammal const& eagleAsMammal = MakeMammal(eagle);
}
catch(std::bad_cast const& error) { std::cout << error.what() << endl;
}
return 0;
}
Соблюдайтеумеренность!
Везде,где возможно, следует обходиться безиспользования оператора dynamic_cast, отдавая предпочтение виртуальным (или чисто виртуальным) методам:
◦Прииспользованииоператорадобавлениенового классавиерархию может повлечьзасобой ревизиювсегокода, использующего dynamic_cast
◦Прииспользованиивиртуальныхметодов,как правило,изменениесуществующего кодане требуется.
Пример безdynamic_cast
class Animal { public:
virtual std::string GetType()const = 0; virtual ~Animal(){}
};
//птицы и млекопитающие – абстракции
//поэтому в них реализовывать
//GetType() нет смысла
class Bird : public Animal{}; class Mammal : public Animal{};
Пример безdynamic_cast
class Eagle : public Bird { public:
virtual std::string GetType()const { return "Eeagle"; }
};
class Rabbit : public Mammal{ public:
virtual std::string GetType()const {return "Rabbit";}
};
Пример безdynamic_cast
class Cat : public Mammal { public:
virtual std::string GetType()const {return "Cat";}
};
void PrintAnimalType(Animal const & animal)
{
std::cout << animal.GetType() << endl;
}
Спасибозавнимание!