C++ Программирование в среде С++ Builder 5

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), в то время как преобразование той же ссылки в представитель производного класса конструирует новый (временный) объект.



Содержание раздела