Zaochniki / 07_relation
.pdfОтношение Есть разновидность
Наследование интерфейса и реализации
Если функция не определена в производном классе, то происходит е¼ наследование из базового. При этом наследуются:
интерфейс функции, то есть то, что такая функция есть, и у не¼ есть определ¼нные аргументы ( y () все птицы летают);
реализация функции, то есть то действие, которое выполняет функция ( y () / действия / åñëè íå
сказано иначе, птицы летают так).
Часто бывают случаи, когда надо наследовать интерфейс, но нельзя наследовать реализацию. Например, если мы напишем класс Ostrich (страус), и забудем определить функцию y, то страус будет летать как большинство птиц.
Отношение Есть разновидность
Чистые виртуальные функции и абстрактные классы
Что бы наследовать интерфейс, но не наследовать реализацию, используются чистые виртуальные функции . При описании такой функции после параметров добавляется =0 ;
c l a s s B i r d |
{ |
|
p u b l i c : |
|
|
v i r t u a l |
void f l y ( ) = 0 ; // чистая виртуальная ф. |
|
// . . . |
|
|
} ; |
|
|
|
|
Класс в котором есть хотя бы одна чистая виртуальная функция, является абстрактным классом. Объекты абстрактных классов создавать нельзя эти классы описывают абстрактное понятие (например: птицы).
Если наследник переопределит чистую виртуальную функцию, то он становится конкретным классом, и объекты этого типа создавать можно.
Отношение Есть разновидность
Чистые виртуальные функции и абстрактные классы (2)
|
c l a s s |
B i r d { |
// |
абстрактный |
|
класс |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
p u b l i c : |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
v i r t u a l |
void |
f l y ( ) |
= 0 ; |
|
// |
чистая |
виртуальная ф. |
||||||||||||||||||||
|
} ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void |
B i r d : : f l y ( ) |
{ |
/ может |
áûòü |
òåëî / } |
|
|||||||||||||||||||||
|
c l a s s |
Sparrow : |
p u b l i c |
B i r d |
{ |
// |
конкретный класс |
|
|
|
|
|
|
|||||||||||||||
|
p u b l i c : |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
v i r t u a l void f l y ( ) { B i r d : : f l y ( ) } ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c l a s s |
Hen : |
p u b l i c |
B i r d |
{ // |
|
конкретный |
класс |
|
|
|
|
|
|
|
|
|
|
||||||||||
|
p u b l i c : |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
v i r t u a l void f l y ( ) { s l o w _ f l y ( ) } ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
} ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c l a s s |
O s t r i c h : |
p u b l i c |
B i r d |
{ |
// |
абстрактный |
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p u b l i c : |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Отношение Реализован посредством
Реализация отношения Реализован посредством в C++
Отношение Реализован посредством реализуется посредством закрытого наследования или вложения
c l a s s R e c t a n g l e { p u b l i c :
R e c t a n g l e ( i n t aw , i n t ah ) ;
i n t width ( ) const { r e t u r n w; } ; i n t h e i g h t ( ) const { r e t u r n h ; } ;
protected : i n t w, h ;
} ;
c l a s s Square : p r i v a t e R e c t a n g l e { p u b l i c :
Square ( i n t w ) : R e c t a n g l e ( w, w ) ; i n t width ( ) const
{ r e t u r n R e c t a n g l e : : width ( ) } ;
}