Static_cast
Операция статического приведения типа
static саst<целевой тип> (аргумент)
может выполнять преобразования между числовыми типами, а также между указателями либо ссылками на объекты классов, находящихся в иерархическом отношении (если оно однозначно и базовый класс — не виртуальный). Операция реализуется во время компиляции.
Преобразования числовых типов происходят точно так же, как в случае обычной нотации приведений. Приведение указателей и ссылок возможно как от производного класса к базовому (тут все достаточно просто), так и от базового к производному (нисходящее приведение типа). Конечно, следует помнить, что во многих случаях нисходящее приведение указателя базового типа не будет безопасным, если только он не ссылается в действительности на представитель производного класса.
Если некоторый указатель может быть приведен к типу Т*, то объект этого типа может быть приведен к типу Т&.
Объект или значение могут быть приведены к объекту некоторого класса, если в данном классе объявлен соответствующий конструктор или имеется подходящая операция преобразования. Этот момент продемонстрирован в приведенной ниже программе.
Листинг 13.2. Нисходящее приведение указателей и ссылок
//////////////////////////////////////////////////////
// StatCast.срр: Статическое нисходящее приведение типа.
//
#include <iostream.h>
#pragma hdrstop
#include <condefs.h>
class A {} ;
class B: public A { public:
int i;
B(int ii): i(ii) {}
B(A&): i(11) {
cout << "Derived conversion constructor... ";
} };
int main() {
В b(22), *pb = &b;
A Sra = static cast<A&>(b); // Ссылка на b как
// базовый объект.
А *ра = static_cast<A*>(pb); // Указатель на b как
// базовый объект.
cout << "Derived object: " << b.i << endl;
cout << "Downcasting pointer to pointer: "
<< static_cast<B*>(pa)->i << endl;
// Приведение
// указателей.
cout <<"Downcasting referense to referense: "
<< static cast<B&>(га).i<< endl;
// Приведение
// к ссылке.
cout << "Downcasting reference to object: ";
cout << static cast<B>(ra).i<< endl;
// Приведение
// к объекту.
return 0;
}
Вот что выводит этот код:
Derived object: 22
Downcasting pointer to pointer: 22
Downcasting referense to referense: 22
Downcasting reference to object: Derived conversion
constructor... 11
Как видите, приведение ссылки базового класса к ссылке производного дает ссылку на первоначальный объект производного класса (b), в то время как преобразование той же ссылки в представитель производного класса конструирует новый (временный) объект.