Xi x
yi
y
{ int dr = DETECT, mod; // автоопределение драйвера
initgraph (&dr, &mod, "D:\\Borlandc\\BGI");// инициализация граф. режима
int errorcode=graphresult(); // код ошибки инициализации
if(errorcode!=grOk){cout<<" Ошибка "; exit(0);}
setcolor(4); // установлен красный цвет линий
setfillstyle(1,4);
// установлен стиль заполнения 1 – сплошное, 4- красным цветом
{ spot A(200,50,20);
spot D(500,200,30);
A.show();
getch();
D.show(); getch();
A.move(50,60); getch();
D.vary(3); getch();
setcolor(7);
D.point::show ();
getch();
}
closegraph();
}
Из класса point класс spot наследуются координаты x, y точки и две функции GetX () и GetY ().
Методы point::show () и point:: move () замещены в производном классе.
Если нас не устраивает реализация тех или иных функций базового класса, с помощью замещения можно изменить реализацию базовой функции. Нужно в производном классе объявить функцию с тем же именем, параметры и тип возвращаемого результата не важны. Главное, чтобы было то же имя. Исходная функция, продолжая существовать, становится невидимой. Однако ее все же можно вызвать, используя операцию разрешения видимости “::”.
|
|
Функция point:: hide () не наследовалась, т. к. имеет статус private.
Конструктор класса имеет три параметра – координаты центра пятна (xi, yi) и радиус пятна (ri).
Координаты передаются в конструктор базового класса, и создается безымянный объект точка – центр пятна. Конструктор базового класса вызывается до выполнения тела конструктора производного класса.
Затем производится инициализация данных производного класса. Для сохранения образа пятна в оперативной памяти выделяется память с помощью new.
Деструктор автоматически вызывается, когда объект уничтожается при завершении программы или при выходе из области действия соответствующих объектов.
В нашем случае в деструкторе освобождается память, выделенная под образ пятна, и убирается пятно с экрана. Для последнего действия используется функция hide(), которая вызывает графические функции. Таким образом, вызов деструктора по окончанию программы и после функции закрытия графического режима не возможен.
Поэтому в программу включен внутренний блок, где определены объекты и деструктор будет автоматически вызываться при выходе из блока, т.е. еще до closegraph().
Множественное наследование. Виртуальные базовые классы
Класс является прямым базовым классом, если он входит в список базовых при определении производного класса.
А если сам базовый класс является производным от некоторого родителя, причем этот родитель не входит в список базовых классов, то этот родитель является непрямым (косвенным) базовым классом.
Иерархию производных классов принято отображать в виде направленного ациклического графа (НАГ), где стрелкой изображают связь “ производный от”.
|
|
Производные классы располагаются ниже базовых. В том же порядке они должны располагаться в программе и так их объявления рассматривает компилятор.
A ( базовый класс – прямая база для B)
B ( производный от А класс – прямая база для С)
С ( производный класс – с прямой базой В и косвенной А)
На практике часто возникает необходимость создать производный класс, наследующий возможности нескольких классов.
Наличие в определении производного класса несколько прямых базовых классов называют множественным наследованием.
class A { …};
class B {… };
class C { … };
class D: public A, public B, public C {... };
Родители перечисляются через запятую.
Как и в случае одиночного наследования, при создании объекта производного класса сначала конструируются объекты базовых классов (в том порядке, в котором базовые классы перечислены в объявлении производного), и лишь после этого составляется объект производного класса.
Деструкторы выполняются в обратном порядке.