Void main ( )

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 {... };

Родители перечисляются через запятую.

Как и в случае одиночного наследования, при создании объекта производного класса сначала конструируются объекты базовых классов (в том порядке, в котором базовые классы перечислены в объявлении производного), и лишь после этого составляется объект производного класса.

Деструкторы выполняются в обратном порядке.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: