WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте

В языке программирования C++ оператор dynamic_cast является частью механизма динамической идентификации типа данных, который позволяет выполнять приведение типа данных. В отличие от обычного приведения типа в стиле Си, проверка корректности приведения типов производится во время выполнения программы. Оператор dynamic_cast может быть применён к указателям или ссылкам. В случае если осуществляется преобразование указателя, который содержит адрес объекта-родителя, к указателю типа объекта-потомка, то в результате преобразования будет получен нулевой указатель. При работе со ссылками при невозможности преобразования типа будет сгенерировано исключение std::bad_cast. Таким образом, оператор dynamic_cast обнаруживает сходство в процедуре приведения типа с таким языком программирования как Java, в отличие от Си, в котором не выполняется проверка корректности приведения типа во время выполнения программы.

Пример

Предположим, что некоторая функция принимает объект типа A в качестве аргумента и должна выполнить некоторые дополнительные действия в случае, если переданный в функцию объект фактически является объектом типа B - наследником класса A. Такое поведение может быть достигнуто при использовании dynamic_cast следующим образом.

#include <typeinfo> // Для std::bad_cast
#include <iostream> // Для std::cerr и др.

class A
{
public:
	// Механизм динамической идентификации типа данных доступен только для полиморфных 
	// классов (т.е. классов, содержащих хотя бы одну виртуальную функцию-член)
	virtual void foo();

	// другие члены класса...
};

class B : public A
{
public:
	void methodSpecificToB();

	// другие члены класса...
};

void my_function(A& my_a)
{
	try
	{
		B& my_b = dynamic_cast<B&>(my_a);
		my_b.methodSpecificToB();
	}
	catch (const std::bad_cast& e)
	{
		std::cerr << e.what() << std::endl;
		std::cerr << "Этот объект не является объектом типа B" << std::endl;
	}
}

Аналогичный код для функции my_function может быть записан с использованием указателей вместо ссылок:

void my_function(A* my_a)
{
	B* my_b = dynamic_cast<B*>(my_a);

	if (my_b)
		my_b->methodSpecificToB();
	else
	    std::cerr << "Этот объект не является объектом типа B" << std::endl;
}

См. также

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии