Выбрать главу

 return 0;

}

Как видите, использование оператора dynamic_cast упрощает логику, необходимую для преобразования указателя на базовый класс в указатель на производный класс. Вот как выглядят результаты выполнения этой программы.

Операция приведения объекта типа Base к типу Derived не выполнилась.

Это объект класса Derived. Операция приведения объекта типа Base к типу Derived не выполнилась. Это объект класса Derived.

И еще. Оператор dynamic_cast можно также использовать применительно к шаблонным классам.

Оператор const_cast

Оператор const_cast переопределяет модификаторы const и/или volatile.

Оператор const_cast используется для явного переопределения модификаторов const и/или volatile. Новый тип должен совпадать с исходным, за исключением его атрибутов const или volatile. Чаще всего оператор const_cast используется для удаления признака постоянства (атрибута const). Его общий формат имеет следующий вид.

const_cast<type> (expr)

Здесь элемент type задает новый тип операции приведения, а элемент expr означает выражение, которое приводится к новому типу.

Использование оператора const_cast демонстрируется в следующей программе.

// Демонстрация использования оператора const_cast.

#include <iostream>

using namespace std;

void f (const int *p)

{

 int *v;

 // Переопределение const-атрибута.

 v = const_cast<int *> (p);

 *v = 100; // теперь объект можно модифицировать

}

int main()

{

 int x = 99;

 cout << "Значение x до вызова функции f(): " << x<< endl;

 f (&x);

 cout <<"Значение x после вызова функции f(): " << x<< endl;

 return 0;

}

Результаты выполнения этой программы таковы.

Значение х до вызова функции f(): 99

Значение х после функции f(): 100

Как видите, переменная x была модифицирована функцией f(), хотя параметр, принимаемый ею, задается как const-указатель.

Необходимо подчеркнуть, что использование оператора const_cast для удаления const-атрибута является потенциально опасным средством. Поэтому обращайтесь с ним очень осторожно.

И еще. Удалять const-атрибут способен только оператор const_cast. Другими словами, ни dynamic_cast, ни static_cast, ни reinterpret_cast нельзя использовать для изменения const-атрибута объекта.

Оператор static_cast

Оператор static_cast выполняет операцию неполиморфного приведения типов.

Оператор static_cast выполняет операцию неполиморфного приведения типов. Его можно использовать для любого стандартного преобразования. При этом во время работы программы никаких проверок на допустимость не выполняется. Оператор static_cast имеет следующий общий формат записи.

static_cast<type> (expr)

Здесь элемент type задает новый тип операции приведения, а элемент expr означает выражение, которое приводится к этому новому типу.

Оператор static_cast, по сути, является заменителем оригинального оператора приведения типов. Он лишь выполняет неполиморфное преобразование. Например, при выполнении следующей программы переменная типа float приводится к типу int.

// Использование оператора static_cast.

#include <iostream>

using namespace std;

int main()

{

 int i;

 float f;

 f = 199.22F;

 i = static_cast<int> (f);

 cout << i;

 return 0;

}

Оператор reinterpret_cast

Оператор reinterpret_cast выполняет фундаментальное изменение типа.

Оператор reinterpret_cast преобразует один тип в принципиально другой. Например, его можно использовать для преобразования указателя в целое значение и целого значения — в указатель. Его также можно использовать для приведения наследственно несовместимых типов указателей. Этот оператор имеет следующий общий формат записи.