Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lect09.pdf
Скачиваний:
5
Добавлен:
06.02.2016
Размер:
492.28 Кб
Скачать

Пример 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;

}

Спасибозавнимание!

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]