- •Наследование
- •Наследование классов
- •Классы 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 { // самый верхний базовый класс а
Наследование
Наследование – одна из наиболее фундаментальных концепций ООП.
Суть метода:
Имея разработанные классы, пользователь может создавать производные классы ( порожденные, классы потомки , наследники) , к которым переходят (наследуются) все возможности родительских базовых классов (данные и методы базовых классов) , при этом производные классы могут пополняться собственными компонентами (данными и собственными методами).
Допускается множественное наследование - возможность для некоторого класса наследовать компоненты нескольких базовых классов, несвязанных между собой.
Любой производный класс может в свою очередь быть базовым для других классов и таким образом формируется структура, называемая иерархией классов, определяющая для каждого класса приложения родственные связи (“родитель - потомок”) его с другими классами приложения.
Наследование - это основной механизм, позволяющий использовать целые библиотеки классов при разработке новых программных продуктов. Да и сами эти коммерческие библиотеки классов строятся на базе этого механизма, представляя собой разветвленные иерархические структуры классов.
Разрабатывая новое приложение Windows, программист может использовать, напр., библиотеку классов OWL, и для решения своей задачи разработать свою иерархию классов, отвечающую конкретной задаче.
В пакет Borland C++ включена большая группа классов самого различного назначения, напр., группа контейнерных классов, реализующих такие структуры данных как списки, деревья, очереди массивы, множества и др. Использование этих классов позволяет сосредоточиться на предметной стороне задачи, не вникая в детали реализации этих классов.
Наследование классов
При наследовании классов важную роль играет статус доступа компонента.
В иерархии классов (при наследовании) относительно доступности компонент принято следующее соглашение:
Собственные (private) методы и данные доступны только внутри класса, где они определены.
Защищенные (protected) компоненты доступны внутри класса, где они определены, и также доступны во все производных классах.
Общедоступные (public) компоненты класса – глобальны, т.е. доступны из любой точки программы.
На доступность компонент влияет также выбор ключевого слова (class, struct, union ), с помощью которого объявлен класс.
Следует обратить внимание, что ни базовый, ни производный класс не могут быть объявлены с помощью union.
Классы union не могут использоваться при наследовании! Определение производных классов: сlass t : X, y , z {…} ;
Класс T – потомок базовых классов X, Y , Z , из которых он наследует компоненты и методы.
Наследуются методы и данные со статусом доступа public и protected!
При этом,
- если производный класс имеет спецификатор class, то компоненты родителя получают по умолчанию в классе потомке статус - private.
- если это struct – унаследованные компоненты имеют статус public.
class A { protected : int x ;
public : float y ;…} ;
class B : A { . . . } ; // x , y наследуются как private
struct C : A { . . .} ; // x , y наследуются как public
Изменить статус доступа, получаемый по умолчанию можно опять с помощью спецификаторов public, protected и private.
class D: protected A { . . . } ; // x , y наследуются как protected
class E: public A { . . . } ; //x наследуются как protected, а y как public
class M : private A { . . . } ; // x , y наследуются как private
struct N : : protected A { . . .} ; // x , y наследуются как protected
struct P: public A { . . . } ; // x наследуются как protected, а y как public
struct N : : private A { . . .} ; // x , y наследуются как private
Пример:
…
class A { //базовый класс
int x // закрытое данное класса А
public:
A( int xx =0) { x=xx; cout<< “ A ! ”;} // конструктор класса А
int GetX ( ) {return x;} // функция-член класса А
~A ( ) {cout<<endl<<”DA ”; } // деструктор класса А
} ;
class B : public A { // производный от А класс B
int y; // закрытое данное класса B
public :
B ( int yy=0 ) { y = yy ; cout << “ B ! ” ; } // конструктор класса B
int GetY { return y ;} // функция-член класса B
~B ( ) { cout<< “ DB “ ; } // деструктор класса B
};