- •Наследование
- •Наследование классов
- •Классы union не могут использоваться при наследовании! Определение производных классов: сlass t : X, y , z {…} ;
- •Void main ( )
- •Передача параметров в базовый класс
- •Конструкторы с инициализацией по умолчанию в иерархии классов
- •Класс “точка на графическом экране”. Производный класс –“пятно”
- •Void point :: show (void)
- •Void point ::move ( int xn, int yn )
- •Int&point::GetX (){return X;}
- •Int& point:: GetY(void) {return y;}
- •Initgraph( тип графического драйвера, режим адаптера , путь к драйверу)
- •Void far initgraph (int far * graphdriver, int far * graphmode, char far * pathtodriver);
- •Void main ( )
- •Рассмотрим класс “ пятно”
- •Int size;
- •Void main ( )
- •Множественное наследование. Виртуальные базовые классы
- •Рассмотрим множественное наследование на примере.
- •Void show ()
- •Объект базового класса point дублируется:
- •Spotelli
- •Void show()
- •Void hide()
- •Void show()
- •Void hide()
- •Void main ( )
- •Class a { // самый верхний базовый класс а
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
При наследовании, особенно множественном могут возникать неоднозначности при доступе к одноименным компонентам разных базовых классов.
Способ устранения неоднозначностей – использование квалифицированных имен компонент (включающих имена классов и операцию принадлежности “::”).