Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
40
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Часть II. Объектно-ориентированное программирование

С* с = new С; demo(*c); // Правильно

return 0; }

Перекрестное преобразование

Операция dynamic_cast позволяет выполнять безопасное преобразование типа между производными классами одного базового класса, например:

#include <iostream.h> #include <typeinfo.h> class B{

public: virtual void fl(){};

}:

class C: public B{

public: void f2(){ ... }:

}:

class D: public B{ ... };

void demo(D* p){

С* с = dynamic_cast<C*>(p);

if(c)c->f2():

else cout «" не выполнено ":

}

int main(){

B* b = new C: demo((D*)b);

return 0:

}

Классы С и D являются производными от класса В. Функции demo передается указатель на класс D, являющийся на самом деле указателем на «братский» для него класс С, поэтому динамическое преобразование типа из D в С в функции demo завершается успешно.

ПРИМЕЧАНИЕ

Указатель для передачи в функцию сформирован искусственным образом исключительно для демонстрации возможности динамического преобразования типа.

При необходимости можно осуществить преобразование между базовыми классами одного производного класса, например:

#include <iostream.h> #include <typeinfo.h> class B{

public: virtual void fl(){ ...};// В С }: // \ /

class C{ // D

public: virtual void f2(){ ... }:

}:

class D: public B, public C{}:

Глава 8. Преобразования типов

237

void demo(B* b){

С* с = dynamic_cast<C*>(b); if(c)c->f2():

}

int main(){

D* d = new D; demo(d); return 0; } Класс D является потомком В и С, поэтому содержит методы обоих классов. Если в функцию demo передается на самом деле указатель не на В, а на D, его можно преобразовать к его второму базовому классу С.

Операция static_cast

Операция static_cast используется для преобразования типа на этапе компиляции между:

  • целыми типами;

  • целыми и вещественными типами;

  • целыми и перечисляемыми типами;

  • указателями и ссылками на объекты одной иерархии, при условии, что оно однозначно и не связано с понижающим преобразованием виртуального базового класса.

Формат операции:

static_cast <тип> (выражение)

Результат операции имеет указанный тип, который может быть ссылкой, указателем, арифметическим или перечисляемым типом.

При выполнении операции внутреннее представление данных может быть модифицировано, хотя численное значение остается неизменным. Например:

float f = 100;

int i = static_cast <int> (f);

// Целые и вещественные имеют различное внутреннее представление

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

Операция static_cast позволяет выполнять преобразования из производного класса в базовый и наоборот без ограничений:

class B{};

class С: public В{};

С с;

В *bp = static_cast<B*>(c); // Производный -> базовый

В Ь:

С &ср = static_cast<C&>(b); // Базовый -> производный

238