Void main( )

Class que

Class A

{ int x, y;

public:

A (int xx=0, int yy =0){ x=xx; y = yy; }

A func ();

}

A A:: func() { if (x%2) x++; // функция x преобразующая в четное

return * this;

}

void main ()

{ A a1 (17, 55)

A a2 = a1. func ();

}

/* Можно объявить так

A* A:: func ()

{ …

return this} */

Чаще всего this используетсяпри организации связанных списков, звеньями которых должны быть объекты класса и встает необходимость включать в связи указатель на тот объект, который в данный момент обрабатывается

Пример: Очередь

#include <iostream.h>

#include<stdio.h>

{ static que*first; // указатель(адрес)первого элемента очереди

que*next; // указатель на следующий элемент очереди

char bukva; //содержимое элемента очереди

public: // общедоступные функции

que(char c) { bukva = c }; // конструктор

void add (void); // функция добавления элемента в очередь

static void print (void); // вывод содержимого очереди

}

// определения функций:

void que::add(void)

{ que* list= first; // вспомогательный указатель устанавливается на

// начало очереди

que * uk; // вспомогательный указатель для продвижения по

//очереди

while(list!=NULL) { uk = list; list=list->next } //продвижение по очереди

if(uk!=NULL) {uk->next=this; }// присоединение в конец очереди

else first = this; // очередь пустая

this->next=NULL; }

void que::print (void)

{ que *list = first; // устанавливаем на начало очереди

if (list = = NULL) {cout << “ список пуст”; return; }

else cout<<”содержимое списка:”

while(list!=NULL)

{ cout<< list->bukva; list= list->next; }// выводим и продвигаемся по

// очереди

}

que * que:: first = NULL; //инициализация статического компонента

{ // формируем объекты класса

que A(‘a’); que B(’b’); queC(‘c’); queD(‘d’);

que::print(); // выводим фразу, что список пуст

A.add(); B.add(); C.add(); D.add();// включаем в список

// элементы

que::print(); } // выводим список

Наследование

Наследование – одна из наиболее фундаментальных концепций ООП.

Суть метода:

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

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

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

Наследование - это основной механизм, позволяющий использовать целые библиотеки классов при разработке новых программных продуктов. Да и сами эти коммерческие библиотеки классов строятся на базе этого механизма, представляя собой разветвленные иерархические структуры классов.

Разрабатывая новое приложение Windows, программист может использовать, напр., библиотеку классов OWL, и для решения своей задачи разработать свою иерархию классов, отвечающую конкретной задаче.

В пакет Borland C++ включена большая группа классов самого различного назначения, напр., группа контейнерных классов, реализующих такие структуры данных как списки, деревья, очереди массивы, множества и др. Использование этих классов позволяет сосредоточиться на предметной стороне задачи, не вникая в детали реализации этих классов.

Наследование классов

При наследовании классов важную роль играет статус доступа компонента.

В иерархии классов (при наследовании) относительно доступности компонент принято следующее соглашение:

1) Собственные (private) методы и данные доступны только внутри класса, где они определены.

2) Защищенные (protected) компоненты доступны внутри класса, где они определены, и также доступны во все производных классах.

3) Общедоступные (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

};


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



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