Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Выполнение с помощью операции dynamic_cast повышающего преобразования




равносильно простому присваиванию:

class В{ / *... * / };

class С: public В{ /*... */ };

С* с = new С;

В* b = dynamic_cast<B*>(c); // Эквивалентно В* b = с;

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

Операция 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){

C* с = 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>

finclude <typeinfo.h>

class B{

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

}: // \ /

class C{ // D

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

};

class D: public B, public C{};

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!

Преобразование ссылок

Для аргумента-ссылки смысл операции преобразования несколько иной, чем для

указателя. Поскольку ссылка всегда указывает на конкретный объект, операция dynamic_cast должна выполнять преобразование именно к типу этого объекта. Корректность приведения проверяется автоматически, в случае несовпадения порождается исключение bad_cast:

#include <iostream.h>

#include <typeinfo.h>

class B{

public: virtual void fl () { };

};

class C: public B{

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

};

void demo(B& p){

try{

C& с = dynamic_cast<C&>(p);

C.f2();

catch(bad_cast){

}

}

int main(){

B* b = new B; demo(*b); // Порождается исключение

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

Return 0;

}

 

Приведение типа указателя

ВНИМАНИЕ!!! Смотреть reinterpret_cast!

НАСЛЕДОВАНИЕ

Определение наследования. Примеры иерархии понятий.

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

Механизм наследования классов позволяет строить иерархии, в которых производные

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

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

классы приобретают все больше конкретных черт. Множественное наследование позволяет одному классу обладать свойствами двух и более родительских классов.

 

Реализация наследования в ООП.

Производный класс имеет все поля и методы предка + добавочные методы (поля, изменённые права доступа к элементам предка).

Класс – предок – базовый (порождающий, родительский);

класс – наследник – производный (порождённый, класс-потомок, наследник, дочерний класс);

Непосредственный базовый класс входит в список базовых классов при определении класса.

30.3.Возможности наследования классов:

Можно:

Добавлять в производный класс поля и методы; модифицировать в производном классе методы базового класса;

Нельзя:





Поделиться с друзьями:


Дата добавления: 2016-07-29; Мы поможем в написании ваших работ!; просмотров: 504 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Люди избавились бы от половины своих неприятностей, если бы договорились о значении слов. © Рене Декарт
==> читать все изречения...

2514 - | 2318 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.009 с.