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




Скачать 41.79 Kb.
НазваниеНаследование единичное наследование
Дата публикации30.08.2013
Размер41.79 Kb.
ТипДокументы
www.vbibl.ru > Информатика > Документы
№14. Иерархия классов. ТВФ.

Иерархия классов


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

  1. единичное наследование

D-|>B STACK(объект D): часть В, часть D

  1. множественное наследование


STACK:

pdd

---> B \

pd1 часть D1 / - это delta(D2)

---> B

pd2 часть D2

-----------

часть DD

При изменении типа указателя меняется его значение:

delta(D2) – смещение подобъекта D2 относительно начала объекта

Еще одна проблема – дублирование полей базового класса.

Для решения этой проблемы используется виртуальное наследование.

  1. виртуальное множественное наследование

STACK:

VB

D1

D2

DD

Виртуальность – свойство наследования, но не класса. Один и тот же класс можно наследовать и виртуально и невиртуально.

Такой тип наследования позволяет организовывать связь между братьями.

См. схему выше. +

VB {virtual void f()} D1 {void f()} D2{void g(){f();}}

Такие классы называются подклеенными. При работе через объект DD в функции g() будет вызвана функция f() из D1.

Виртуальное наследование не решает проблемы возможного дублирования вызова методов.

См. схему выше. +

VB { f()} D1 { f()} D2{ f()} DD{f();}

f вызывает f из базового класса и что-то доделывает.

В таком случае f базового класса будет вызвана 2 раза.

Эта проблема не решена. Решается перепрограммированием функций f.

Та же самая проблема возникает и при вызове конструкторов. Она решена для языка С++ по следующим правилам: полный объект – такой объект, который не является подобъектом базового класса другого объекта, его класс называется конечным производным (most derived))

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

    1. конструктором конечного производного класса в списке инициализации

    2. своим конструктором по умолчанию (если он существует)

    3. все остальные инициализации игнорируются

См. схему выше +

VB { VB (int i) {}} D1{D1(int i):VB(i+1){}}

D2{ D2(int i):VB(i){}} DD{DD(int i):D1(i), D2(i){}}

Здесь ошибка:

  1. если бы был конструктор без параметров, то вызвался бы он

  2. в списке инициализации конструктора DD: VB(i+2)


^ Таблица виртуальных функций

Если в классе есть хотя бы одна виртуальная функция, то в каждый его объект включается один или несколько указателей на ТВФ, а для самого класса строится ТВФ. Указатели таблицы используются для организации виртуального вызова во время выполнения программы.

  1. единичное наследование

class B{

public: int b;

virtual void f(int);

virtual void g(int);

virtual void h(int);

}

class D: public B{

public: int d;

void g(int);

}

class DD: public D{

public: int dd;

void h(int);

}

DD* pdd = new DD;

p
vtbl для B1 и D
dd
->g(2); // на этапе трансляции перейдет в

(*(pdd->vptr[1]))(pdd, 2)

  1. множественное наследование

class B1{public: virtual void f();}

class B2{public: virtual void f();

virtual void f();}

class D: public B1, public B2{

public: void f();

}

delta(B2) надо запоминать, если мы хотим работать с объектом класса D через указатель на В2, чтобы правильно передавать this.
^ Динамическое определение типа объекта

    1. включить поле: тип объекта.

Плохо, т.к. лишнее поле; проблемы с определением значений

    1. использование виртуальных функций

class B{

public: static int r;

virtual int* mytype();

}

int* B::mytype {return &r;};
class D: public B{

public: static int r;

virtual int* mytype();

}

int* D::mytype(){return &r;}

Появляется одна статическая переменная на класс. Индикатором типа объекта является адрес статической переменной. Появляется дополнительное поле, роль которого выполняет указатель на ТВФ. И, если раньше виртуальных функций не было, то размер объекта увеличивается на размер этого указателя.



    1. RTTI (Runtime Type Information)

Обеспечивает доступность операции typeid, которая может быть применена к имени типа или выражения. Возвращает ссылку на объект типа type_info(type_info&)

class type_info;

const type_info& typeid(type_name) throw(); // не возбуждаем ИС

const type_info& typeid(expr) throw(bad_typeid);//ИСbad_typeid, if expr=0

class type_info{public: virtual ~type_info();}

bool operator==(const typeinfo&) const; bool operator!=

bool operator before // есть упорядочение

const char * name() const; // стр. представление имени класса

private: type_info(const type_info&)// запрещено копирование

type_info operator=(const type_info&)// объектов

};

Указатель на объект type_info добавляется в ТВФ. Данный вариант динамического определения типа удобно применять, когда у классов нет общего интерфейса и когда требуется хранить дополнительную информацию о классе. Сам класс type_info предназначен для расширения с помощью наследования.

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

dynamic_cast (P) // преобразование к указателю

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

Р – указатель или ссылка на полиморфный объект, т.е. имеющий виртуальные функции.

В случае T*: если преобразование невозможно, то результат=0.

В случае T&: возбуждается ИС bad_cast

Применяется для определения реального типа полиморфного объекта. Чаще всего используются два случая:

  • для понижающего преобразования (down_cast)

применяется для организации сериализации

  • для перекрестного преобразования (cross_cast)

Добавить документ в свой блог или на сайт

Похожие:

Наследование единичное наследование iconВопросы к экзамену по курсу «Римское право»
Наследование по закону (ab intestato). Ответственность наследников по долгам наследодателя

Наследование единичное наследование iconЛекция 4
Прежде всего, вспомним три основные свойства, при наличии которых можно говорить, что некоторый язык предназначен для объектно-ориентированного...

Наследование единичное наследование iconВопросы к экзамену по дисциплине "Земельное и аграрное право"
...

Наследование единичное наследование iconСтатья 1110. Наследование
По гражданским правоотношениям, возникшим до введения в действие части третьей Гражданского кодекса рф, раздел V "Наследственное...

Наследование единичное наследование iconСтатья 1110. Наследование
По гражданским правоотношениям, возникшим до введения в действие части третьей Гражданского кодекса рф, раздел V "Наследственное...

Наследование единичное наследование iconТри случая, когда нужна оценка: наследование, ипотека, развод
Профессиональная оценка обычному человеку требуется лишь в трех случаях: если вы делите с кем-то наследство, «пилите» имущество при...

Наследование единичное наследование iconГены и хромосомы. Их строение и функционирование
Ген представляет собой участок молекулы днк, определяющий наследование того или иного признака. Так как молекулы ДНК в процессе деления...

Наследование единичное наследование iconЛабораторная работа №2 простое наследование задание. Реализовать...
Задание. Реализовать классы на языке C++, описанные в вариантах заданий. На примере создания объектов этих классов продемонстрировать...

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

Наследование единичное наследование iconТесты 2011 Тема Общественная сущность человека § Человек как личность
Человек как отдельное, единичное существо, принадлежащее к человеческому роду – это

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
www.vbibl.ru
Главная страница