Класова йерархия в С++

В C++ всеки програмист може да дефинира и обработва свои собствени типове данни. Тези потребителски дефинирани данни се обозначават като класове. Класът се състои от различни типове данни (свойства), обединени по някакъв признак и редица операции /функции и или също методи/ над тези данни. Обикновено класът бива въведен с цел описването на нов обект. Променливите, които принадлежат към някакъв клас се наричат обекти. Езикът C++ поддържа локална област в класа и достъпът до нейните компоненти е строго ограничен. Програмистът управлява този достъп с помощта на интерфейс, осъществен с помощта на методите на класа. Тяхното извикване става чрез размяна на съобщения. В езикът C++ с помощта на класовете се постига високо ниво на абстракция.

Класовете са нови типове данни, дефинирани от потребителя. Те могат да обогатяват възможностите на вече съществуващ тип или да представят напълно нов тип данни.

Класовете са подобни на структурите, даже може да се каже, че в някои отношения са почти идентични. В C++ класът може да се разглежда като структура, на която са наложени някои ограничения по отношение на правата на достъп.

  1. Различни видове наследственост и достъп до наследени членове

Важен механизъм залегнал в класовете засяга дефинирането на наследени типове данни. Този механизъм допуска един клас да наследи компонентите, свойствата и методите от друг клас, като освен това може да въведе и нови компоненти валидни само за него. В такъв случай се казва, че новият клас е наследил първия. Наследникът от своя страна може също да бъде наследен. Този механизъм допуска дефинирането на т.нар. класова йерархия. Когато един клас наследява свойства единствено от един родил, тогава имаме случай на просто наследяване.

C++ класове и програмиранеКогато един клас наследява свойства от много класове, тогава наследяването се нарича множествено наследяване. Множественото наследяване дефинира отношения между независими класове.

Производните класове и наследяването са една от най-важните характеристики на обектно-ориентираното програмиране (ООП). Чрез механизма на наследяване от съществуващ клас се създава нов клас. Класът от който се създава се нарича базов (основен) клас, а този, който е създаден – производен.

Понятията основен и производен клас са относителни, тъй като производен клас може да е основен за други класове, а основен – да е производен от други основни класове. Производният клас може да наследи компонентите на един или няколко базови класа. В първия случай наследяването се нарича единично (просто), а във втория – множествено.

Дефинирането на производни класове е еквивалентно на конструирането на йерархии от класове. Защо се налага дефинирането на производни класове? В кои случаи и как се прави това? Какви са предимствата от дефинирането на производни класове? На тези въпроси ще дадем отговор в следващите разглеждания.

Ако множество от класове имат общи данни и методи, тези общи части могат да се обособят като основни класове, а всяка от останалите части да се дефинира като производен клас на съответния основен class. Така се прави икономия на памет, тъй като се избягва многократното описание на едни и същи програмни фрагменти.

При конструирането на производни класове е достатъчно да се разполага само с обектните модули на основните класове, а не с техния програмен код. Това позволява да бъдат създавани библиотеки от класове, които да бъдат използвани при създаването на производни класове.

Тези предимства, а също възможността за реализиране на полиморфизъм, мотивират въвеждането на производни класове.

Полиморфизъм.(Възможност за представяне по различни начини)

Това свойство между предоставя възможност за многократно използуване на методи с едно и също име в класовата йерархия. Това означава, че един метод може да се обвърже с различен програмен код. Просто казано: Това какво ще предизвика едно съобщение зависи от това за кой обект то се отнася. Нека имаме активиране на метода “Покажи обекта на екран” за обектите точка и окръжност. В основата си тези съобщения принципно са едни и същи, но изпълнението им ще е различно.

Обикновено последователността на изпълнение на методите се определя на ниво компилация. Но при обектноориентираните езици последователността на изпълнение може да се определи по време на изпълнението на програмата в зависимост от наследствената йерархия. Този метод на свързване се нарича механизъм на късното свързване.

Декларациите на компонентите на производен клас, а също дефинициите на неговите методи не се различават от съответните при обикновените класове.

Множеството от компонентите на един производен клас се състои от компонентите на неговите базови класове и компонентите, декларирани в самия производен клас. Оттук произлиза и терминът наследяване. Механизмът, чрез който производният клас получава компонентите на базовия, се нарича наследяване. Когато производният клас има няколко базови класа, той наследява компонентите на всеки от тях. Наследяването в този случай е множествено.

Процесът на наследяване се изразява в следното:

  • наследяват се данните и методите на основния клас;
  • получава се достъп до някои от наследените членове на основния клас;
  • производният клас “познава” реализацията само на основния клас, от който произлиза;
  • производният клас може да е основен за други класове.

Производният клас може да дефинира допълнително:

  • свои член-данни;
  • методи, аналогични на тези на основния клас, а също и нови.

Дефинираните в производния клас данни и методи се наричат собствени.

В рамките на един клас (без наследяване), protected частта има аналогична роля като тази на private частта. До компоненти от тип protected имат пряк достъп само член-функции и приятелски функции на класа.

Атрибутът за област на базовия клас в C++ декларацията на производния клас (public, private или protected) управлява механизма на наследяване и определя какъв да бъде режимът на достъп до наследените членове. Таблица 1 показва наследяванията на компоненти на основен клас в зависимост от атрибута за област.

Атрибут

за област

Компонента на основен

клас, определена като

Наследява се като
public private

public

protected

private

public

protected

private private

public

protected

private

private

private

protected private

public

protected

private

protected

protected

Табл. 1. Наследявания на компоненти на основен клас в производен

От таблицата се вижда, че:

  • Ако базовият клас в C++ е деклариран като public в производния клас, всички private, public и protected компоненти на базовия клас се наследяват съответно като private, public и protected компоненти на производния клас.

Пример: Ако

class base                                                  class der1 : public base

{private: int b1;                               {private: int d1;

protected: int b2;                            protected: int d2;

public: int b3();                      public: int d3();

};                                                                                  };

можем да си мислим, че der1 е клас от вида:

class der1

{private:

int b1;

int d1;

protected:

int b2;

int d2;

public:

int b3();

int d3();

};

  • Ако базовият клас е деклариран като private в производния клас, всички негови компоненти се наследяват като private.

Сходни статии:

  1. Изпълнението на конструктори и деструктори за обекти от произволен клас Ако базовият клас в C++ е деклариран като protected в производния клас, private компонентите му се наследяват като private, а public и protected – като protected. Пример: Ако class base...
  2. Релизация на херметизацията в MS Visual C++ Цели на херметизацията да скрие подробностите на реализацията (абстракция) да обедини всички необходими физически и функционални характеристики, за да може обектът правилно да изпълнява предназначението си, т. е. да съвместява...
  3. Изпълнението на C++ конструктори и деструктори за обекти от произволен клас Задача на C++ за конструктори и деструктори от произволен клас Да се дефинират класовете People, Student и PStudent, така че инициализиращите действия да се изпълняват от подходящи конструктори. Разрушителните действия...
  4. Пример за обектно ориентирана реализация на свързан стек Ще се възползваме от тясната връзка между св. списъци и стекове чрез повторно използване на класа на списъците. Ще приложим 2 разновидности на повторното използване. Отначало ще реализираме класа на...
  5. Обектно-ориентирано проектиране (ООП). Правила за обектно-ориентирано проектиране Проектиране на класове и обекти ПЪРВИ ЕТАП ОТДЕЛЯНЕ НА КЛАСОВЕТЕ И ОБЕКТИТЕ ОТ ПО НА ЗАДАЧАТА Класове и обекти могат да бъдат: реални неща от програмиране на обекти абстракции в...

Студио за уеб дизайн услуги, изработка на сайтове, SEO оптимизация и Интернет реклама Seven Web Design представя своите професионални уеб дизайн умения на високо ниво. Seven Web Design е продукт на Уеб Дизайн България Груп ООД ®
Comments are closed.