Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

spotelli

// ellips.cpp

#ifndef ELLI

# define ELLI 1

# include”point.cpp”

class ellips: public point {

protected:

int rx, ry; //радиусы эллипса

public:

ellips (int xi, int yi, int rxi, int ryi): point(xi,yi)

{rx = rxi; ry =ryi;}

Void show()

{ ellipse (x,y,0,360,rx,ry); }

Void hide()

{int a, b;

a= getcolor();

b=getbkcolor();

Setcolor(b);

Ellipse (x,y,0,360,rx,ry);

Setcolor(a);

}

};

#endif

// текст программы

#include “spot.cpp”

#include”ellips.cpp”

// класс “пятна в эллипсе”

class spotelli: public spot, public ellips {

int min(int a, int b){return((a<b)?a:b);} // вспомогательная функция

public:

spotelli(int xi, int yi, int rxi, int ryi):

spot(xi, yi, min(rxi,ryi)), // координаты центра пятна совпадают

ellips(xi, yi, rxi, ryi) {} // с центром эллипса

// Конструктор производного класса не выполняет никаких действий

Void show()

{ spot::show(); // показать пятно

ellips::show();} // показать эллипс

Void hide()

{spot::hide(); // убрать пятно

ellips::hide(); // убрать эллипс

}

};

Void main ()

{ int dr = DETECT, mod=DETECT;

// int far*t=&dr; int far *q= &mod;

initgraph (&dr, &mod, "D:\\Borlandc\\BGI");

int errorcode=graphresult();

if(errorcode!=grOk){cout<<"Ошибка "; exit(0);}

Setcolor(4);

Setfillstyle(1,4);

{ spotelli a1(100,100,20,80);

Spotelli a2(400,300,230,100);

A1.show();getch();

A2.show(); getch();

A2.hide(); getch();

A1.hide();getch();

}

closegraph(); }

 
 


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

Причем это делается не в объявлении самого базового класса (А), а в классах, производных от него.

 

class A { // самый верхний базовый класс А

protected:

Int x;

... };

class B: public virtual A { // класс В, производный от А

... };

class C: public virtual A { // класс С, производный от А

... };

class D: public B, public C { // класс D, производный и от В и от С

... };

Теперь объект класса D будет включать только один экземпляр класса A и к переменной x в классе D можно обращаться просто по имени, т.к. она существует в единственном экземпляре. Графически это выглядит так:

 

A

B C

       
   


D

Отметим, что виртуальность класса – это не свойство класса, а результат особенностей процедуры наследования.

Один и тот же класс при множественном наследовании может, включен в производный класс при непрямом наследовании и как виртуальный и как не виртуальный.

 

X X X

B Y Z C

A

class X {...};

class Y: virtual public X {... };

class Z: virtual public X {... };

class B: public X {... };

class C: public X {... };

class A: public B, public Y, public Z, public C {... };

Объект класса А включает три экземпляра класса X: один виртуальный, общий для классов Y и Z, и два не виртуальных, относящихся к классам В и С.

Виртуальный класс может быть прямым родителем:

class X {... };

class A: virtual public X {... };

class B: virtual public X {... };

class D: public A, public B, virtual public X {... };

X

A B

D

При наследовании, особенно множественном могут возникать неоднозначности при доступе к одноименным компонентам разных базовых классов.

Способ устранения неоднозначностей – использование квалифицированных имен компонент (включающих имена классов и операцию принадлежности “::”).


Дата добавления: 2015-07-15; просмотров: 95 | Нарушение авторских прав


Читайте в этой же книге: Void main ( ) | Int y ; | Int y ; | Putimage(x-rad, y-rad, pspot, XOR_PUT); | Множественное наследование. Виртуальные базовые классы |
<== предыдущая страница | следующая страница ==>
Void move ( int xn, int yn)| Наследственное право

mybiblioteka.su - 2015-2024 год. (0.01 сек.)