Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Марченко А.Л. -> "С++ бархатный путь " -> 100

С++ бархатный путь - Марченко А.Л.

Марченко А.Л. С++ бархатный путь — М.: Горячая линия - Телеком, 2005. — 399 c.
ISBN 5-93517-056-6
Скачать (прямая ссылка): barhatniyput2005.djvu
Предыдущая << 1 .. 94 95 96 97 98 99 < 100 > 101 102 103 104 105 106 .. 152 >> Следующая

return 0;
)
class D: public B, public С
<
public: int *0;
int Funl(int key);
};
int D::Funl(int key)
{
cout « " Funl ( " « key « u ) from D " « endl cout « " *0 —• " « xO « "..." « endl; return 0;
)
void main {)
(
D MyD;
ObjD.xO - 111;
A* pObjA;
B* pObjB;
C* pObjC;
D* pObjD * CMyD;
MyD.B:;xO - 100; MyD.C::*0 « 333;
MyD.Funl(1);
pObjD->B::Funl(1);
262
pObjD-Х!-. :Fun2(l) ;
pObjA = (A*) (B*) pObjD;
((A*) (<C‘) pObjD))->Funl<111);
(<A*J ((B*) pObjD))->Funl(111);
pObjA->Funl(lll) ;
pObjC » (C*)fcMyD; pObjA » (A*)pObjC;
((A*)(B*)pObjD)->x0 = 1;
((A*) (B*)pObjD)->Funl(777) ;
( (A*) (C*)pObjD)->x0 - 2;
((A*)(C*}pObjD)->Funl(999);
)
Виртуальные функции и виртуальные классы
Мы продолжаем модификацию последнего варианта нашей программы, добавляя к прототипу функции int A::Fun1 (int); спецификатор virtual.
class A
<
public: int xO;
virtual int Funl(int key);
) ;
Результат выполнения программы можно предугадать. Функция-член класса А становится виртуальной, а знвчит, замещается в соответствии с таблицей виртуальных функций в ходе сборки объекта-представителя класса-наследника Р. В состав этого объекта включены два независимых друг от друга базовых фрагмента-представителя базового класса А. Количество таблиц виртуальных функций соответствует количеству базовых фрагментов, представителей базового класса, содержащего объявления виртуальных функций.
Как бы мы ни старались, вызвать функцию-член класса А из любого фрагмента объекта-представителя класса D невозможно. Сначала конструкторы строят объект, настраивают таблицы виртуальных функций, а потом уже мы сами начинаем его “перекраивать", создавая на основе базового фрагмента видимость самостоятельного объекта. Напрасно. Объект построен, таблицы виртуальных функций также настроены. До конца жизни объекта виртуальные функции остаются недоступны.
263
Следует обратить особое внимание на то обстоятельство, что независимо от места вызова виртуальной функции (а мы её вызываем непосредственно из базовых фрагментов объекта), замещающей функции в качестве параметра передаётся корректное значение this указателя.
Очевидно, что соответствующая корректировка значения этого указателя производится в процессе вызова замещающей функции. При этом возможны, по крайней мере, два различных подхода к реализации алгоритма корректировки.
Соответствующее корректирующее значение может определяться в момент создания объекта конструкторами и храниться в виде константной величины вместе с таблицами виртуальных функций, либо this указатель может динамически настраиваться в момент вызова виртуальной функции благодаря специальному программному коду настройки этого указателя. Но это всё уже зависит от конкретной реализации языка.
В этом разделе нам осталось обсудить понятие виртуального базового класса. Согласно соответствующей БНФ, спецификатор virtual может быть включён в описатель базы:
ОписательБааи ::— ПолноаИмяКласса
: :» /virtual.? !СлтцкфикаторДостуяа 1 ПояиоеИюЫСяасса : :» IСпецификаторДоступа1 (virtual; ПолноеИмяКласса
Модифицируем нашу программу. Мы добавим в описатели баз классов-наследников В и С спецификатор virtual:
class А (
public: int хО;
int Funl(int key);
);
class B: virtual public A і
public: int xO;
int Funl(int key); int Fun2(int key);
i:
class C: public virtual A (
public: int xO;
int Fun2(int key);
);
class D: public B, public С (
public: int xO;
264
int Funl(int k«y);
) ;
Этот спецификатор в описании базы позволяет минимизировать структуру создаваемого объекта. Виртуальные базовые классы не тиражируются. Вот как выглядит после модификации граф класса-наследника D:
D
А вот как меняется структура класса D, представляемая в виде неполной схемы.
А
ЇЇ
?
D
D MyD;
А вот и схема объекта-представителя класса D.
HyD : ;»
__________________________А__________________
____________________________________(int)xO;
В
(int)xB;
__________________________С__________________
(int)xO;
__________________________D__________________
____________________________________(int)xO-,
____________________________________(int)xD;
Различные варианты обращения к данным-членам базового фрагмента приводят к модификации одних и тех же переменных.
Базовый фрагмент объекта связан со своими производными фрагментами множеством путей, по которым с одинаковым успехом может быть обеспечен доступ к данным-членам базового фрагмента.
265
В C++ допускаются такие варианты объявления классов-наследников, при которых одни и те же классы одновременно выступают в роли виртуальных и невиртуальных базовых классов. Например, сам класс D может быть использован в качестве базового класса:
Предыдущая << 1 .. 94 95 96 97 98 99 < 100 > 101 102 103 104 105 106 .. 152 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.