Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование на C++.pdf
Скачиваний:
61
Добавлен:
23.03.2016
Размер:
1.88 Mб
Скачать

Пример: переопределение методов

Базовые

 

Переопределим метод draw в производном классе Dog:

 

 

 

 

сведения

 

 

 

 

Введение

18

class Dog : public

Animal

Ссылки

19

{

 

 

Классы

 

 

20

private :

 

 

Поля и методы

 

 

21

char * breed ;

 

Конструкторы

 

 

public :

 

 

Создание и

22

 

 

 

 

 

 

уничтожение 23

Dog ( char

* bread );

объектов

24

virtual

void

draw ();

Копирование

 

 

 

 

объектов

25

};

Одиночное

26

наследование

 

Множественное

27

наследование

28

 

Обобщённое

29

программирова-

ние

30

 

Перегрузка

31

 

операций

32

 

Исключения

33

34

35

Dog :: Dog ( char * bread ):

Animal (" Canis lupus familiaris "), breed ( breed ) {}

void Dog :: draw () {

 

 

 

cout << "

/

| __

\n"

"

(

 

@ ‘ ___

\n"

"

/

 

 

O \n"

"

/

( _____ /

\n"

"

/ _____ /

U

\n";

36 }

38 / 99

Динамическое приведение типов

Базовые

сведения

Введение

Ссылки

Классы

Поля и методы

Конструкторы

Создание и уничтожение объектов Копирование

объектов

Одиночное

наследование

Множественное наследование

Обобщённое

программирова-

ние

Перегрузка

операций

Исключения

Операция динамического приведения объекта obj к типу T проверяет, является ли тип T одним из типов объекта obj, и возвращает obj, если является. В противном случае операция либо возвращает нулевой указатель, либо порождает исключение.

В C++ операция динамического приведения типа может применяться к указателям и ссылкам на объекты и записывается как

dynamic_cast <T > ( obj )

Так как нулевых ссылок не существует, то при неудачном приведении порождается исключение std::bad_cast.

39 / 99

40 / 99

Пример: динамическое приведение типов не всегда допустимо

Базовые

1

class

Animal {};

 

сведения

2

class

Dog : public

Animal {};

Введение

3

class

Cat : public

Animal {};

Ссылки

 

 

 

 

Классы

4

 

 

 

 

int main ()

 

Поля и методы

5

 

 

 

 

 

Конструкторы

6

{

 

 

Создание и

7

Animal

*a

=

new

Dog ();

 

уничтожение

8

Dog

* dog

=

dynamic_cast < Dog *>

(a );

объектов

 

 

 

 

 

 

 

 

Копирование

9

cout

<<

dog ;

 

 

объектов

10

return

0;

 

 

 

 

Одиночное

 

 

 

 

 

}

 

 

 

 

 

 

наследование

11

 

 

 

 

 

 

Множественное

наследование

Обобщённое

программирова-

ние

Перегрузка

операций

g++ выдаёт ошибку:

cannot dynamic_cast ’a ’ ( of type

’ class Animal * ’) to

type ’ class Dog *’ ( source type is

not polymorphic )

 

 

 

 

 

Т.к. в классе Dog нет виртуальных методов, то для эконо-

 

 

 

 

 

 

 

Исключения

мии памяти объект этого класса не содержит информации о

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

типе, тем самым делая невозможным динамическое приве-

 

 

 

 

 

 

 

 

 

дение типов.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример: динамическое приведение типов

Базовые

1

class

Animal

 

сведения

2

{

 

 

Введение

 

 

3

public :

 

Ссылки

 

 

virtual void

f () {}

Классы

4

 

};

 

 

Поля и методы

5

 

 

 

 

 

 

Конструкторы

6

class

Dog : public

Animal {};

Создание и

7

class

Cat : public

Animal {};

уничтожение

 

 

 

 

объектов

8

 

Копирование

9

int

main ()

 

 

 

объектов

10

{

 

 

 

 

 

Одиночное

 

 

 

 

 

 

 

Animal

*a

= new Dog () , *b = new Cat ();

наследование

11

 

Множественное

12

 

Dog

*x

=

dynamic_cast < Dog *>

(a),

наследование

13

 

 

*y

=

dynamic_cast < Dog *>

(b );

Обобщённое

 

 

14

 

cout

<<

x

<< " , " << y;

 

программирова-

 

 

 

 

return

0;

 

 

ние

15

 

 

 

Перегрузка

16 }

операций

 

Исключения Вывод:

0 x603010 , 0

41 / 99