
- •Void main (){
- •Операции, определенные по умолчанию над структурированными объектами
- •Void binar(unsigned char ch)
- •Void main() { int k;
- •Расширение действия (перегрузка) стандартных операций
- •Доступ к компонентам структурированного объекта
- •Void ff(cl1 cl,cl2 c2) { тело_функции }
- •Void f1(...);
- •Void f2(...);
- •Классы и шаблоны
- •Int size; // Количество элементов в массиве
- •Vector(int); // Конструктор класса vector
- •Имя_параиетризованного_класса
- •Int length;
- •Void main () {
- •Наследование и другие возможности классов Наследование классов
- •2. Множественное наследование и виртуальные базовые классы
- •Void show ()
- •Void hide()
- •Void riesquare(void)
- •Void show()
- •Void hide()
- •Void show(void)
- •Void hide()
- •Void main()
- •Void show() // Изобразить на экране эллипс
- •Void hide() { int cc, bk;
- •Int min(int valuel, int value2)
- •Void show()
- •Void hide() // Убрать изображение с экрана дисплея
- •Void main()
- •3. Виртуальные функции и абстрактные классы
- •Void main (void)
- •Имя_проиаводного_класса: : show ()
- •Иня_объекта_производноро_класса. Show ()
- •Void main(void)
- •Void sos (int) ;
- •Void func(char);
- •Void sos (int) ;
- •Void chain::showAll(void) // Изображение элементов списка
- •Void main()
- •4. Локальные классы
- •Void showSeg() // Изобразить отрезок на экране
- •Void showSquare(void) // изобразить квадрат
- •5. Классы и шаблоны
- •Int size; // Количество элементов в массиве
- •Vector(int); // Конструктор класса vector
- •Имя_параиетризованного_класса
Void show() // Изобразить на экране эллипс
{ ellipse(x,y,0,360,rx,ry);
return; } // Убрать с экрана изображение эллипса:
Void hide() { int cc, bk;
cc = getcolor () ;
bk = getbkcolor () ;
setcolor (bk) ;
ellipse(x,y,O,360,rx,ry);
setcolor(cc); }
};
# endif
Как уже отмечалось, определение базового класса должно предшествовать его упоминанию в списке базовых классов. Поэтому в начале текстов spot.cpp и ellips.cpp помещена препроцессорная директива включения текста определения класса point.
В классе ellips конструктор предусматривает задание четырех параметров: координаты центра (хс, ус) и радиусы вдоль осей (rх, гу). Координаты хс, ус используются в качестве параметров при вызове конструктора базового класса point. Чтобы различить компоненты rх, rу класса ellips и обозначенные теми же идентификатора-ми формальные параметры конструктора, используется указатель this. В классе ellips две общедоступные функции show() - изобразить эллипс на экране дисплея; hide() - убрать с экрана изображение эллипса.
Текст программы:
//Р10-03.СРР - круглое пятно в эллипсе - множественное
// наследование с дублированием базовых
// классов (дублируется класс point)
#include "spot.cpp"
#include "eilips.cpp"
// Производный класс - дважды косвенно наследующий
// класс point:
class spotelli: public spot, public ellips { // Вспомогательная функция:
Int min(int valuel, int value2)
{ return ( (valuel < value2) (valuel : value2); }
public:
// Конструктор:
spotelli(int xi,int yi,int rx,int ry) : ellips(xi,yi,rx,ry), spot(xi,yi,min(rx,ry))
{}
// Вывести изображение на экран дисплея:
Void show()
( spot::show();
ellips::show(); }
Void hide() // Убрать изображение с экрана дисплея
{ spot: :hide() ;
ellips: :hide() ; }
};
#include <conio.h> // Для функции
getch()
void main() { int dr = DETECT, mod;
initgraph(&dr,&mod,"c:\\borlandc\\bgi"); { spotelli Al (100,100,20,80); spotelli F4(400,300,230,100); Al.ahow() ; getch() ; F4.show() ; getch() ; F4.hide() ; getch() ; Al.hide() ; }
closegraph(); }
В классе ellips, в классе spot и в классе spotelli наследуются данные х, у класса point - координаты точки на экране. В классе point они определены как защищенные (protected) и сохраняют тот же статус доступа в производных классах, где определяют координаты центров- пятна (класс spot), эллипса (класс ellips) и эллипса с пятном (класс spotelli).
Класс spot мы уже разбирали.
Рис. 10.5. Последовательность изображений на экране при выполнении программы Р10-03 .СРР
Конструктор класса spotelli не выполняет никаких дополнительных действий - последовательно вызываются конструкторы класса ellips и класса spot, причем центры создаваемых фигур совпадают, а в качестве радиуса пятна выбирается меньший из радиусов эллипса. Используемая в этом случае функция min() определена по умолчанию как встроенная (inline) собственная (private) функция класса spotelli.
Чтобы отличать одинаково обозначенные функции, унаследованные классом spotelli из классов spot и eliips, при вызове show о и hide () используются полные квалифицированные имена, в которых применена операция '::'.
Функция main () не содержит ничего нового. Описаны два объекта Al, F4 класса spotelli, которые последовательно изображаются на экране и "стираются" с него.
Чтобы устранить дублирование объектов непрямого базового класса при множественном наследовании, этот базовый класс объявляют виртуальным. Для этого в списке базовых классов перед именем класса необходимо поместить ключевое слово virtual. Например, класс х будет виртуальным базовым классом при таком описании:
class X { ... f (); ... }; class Y: virtual public X { ... }; class Z: virtual public X { ... }; class D: public Y, public Z { ... };
Теперь класс d будет включать только один экземпляр х, доступ к которому равноправно имеют классы Y и z. Графически это очень наглядно:
Иллюстрацией сказанного может служить иерархия классов в следующей программе:
//Р10-04.СРР - множественное наследование с виртуальным
// базовым классом
#include <iostream.h>
class base // Первичный (основной) базовый класс
{ int jj; char cc; char w[10] ; public:
base(int j = 0, char с = '*')
{ jj = j;
cc = c; }
};
class dbase: public virtual base { double dd; public:
dbase(double d = 0.0) : base()
{ dd = d; } };
class fbase: public virtual base { float ff; public:
fbase(float f = 0.0): base() { ff = f; } };
class top: public dbase, public fbase { long tt; public:
top (long t = 0) : dbase (), fbase () { tt - t; } };