Изграждане на класова йерархия е основен механизъм за намаляване сложността на класовете и постигане на полиморфично поведение на обектите


Категория на документа: Информатика




Юзу "Неофит Рилски"

Природо-математически факултет
Тема 3 :
Изграждане на класова йерархия е основен механизъм за намаляване сложността на класовете и постигане на полиморфично поведение на обектите.

Изготвил: Проверил:
Десислава Стойчева гл. ас. Иво Дамянов
Фак. №11250121031
Спец. Информатика
Курс 1
Йерархията на унаследяване дефинира отношения тип-подтип между типовете класове. Например, Panda е тип Bear, на свой ред Bear е тип ZooAnimal. По същия начин и сортираният масив,и масив с проверка на ранга са типове IntArray. Виртуалните функции дефинират типово зависими операции в йерархията на унаследяването - например, функцията draw() на ZooAnimal или subscript оператора на класа масив. Виртуалните функции осигуряват метод за капсулиране на детайли по реализацията на йерархията на унаследяването от програмите, които ги използват. В тази глава ще разгледаме подробно виртуалните функции. Ще разгледаме също един специален случай на унаследяване на класове - този на виртуалния (или още споделен) базов клас.В началото обаче ще преразгледаме презаредимостта на име на функция с аргумент от тип клас.

Различни видове наследственост и достъп до наследени членове
Важен механизъм залегнал в класовете засяга дефинирането на наследени типове данни. Този механизъм допуска един клас да наследи компонентите, свойствата и методите от друг клас, като освен това може да въведе и нови компоненти валидни само за него. В такъв случай се казва, че новият клас е наследил първия. Наследникът от своя страна може също да бъде наследен. Този механизъм допуска дефинирането на т.нар. класова йерархия. Когато един клас наследява свойства единствено от един родил, тогава имаме случай на просто наследяване.
Когато един клас наследява свойства от много класове, тогава наследяването се нарича множествено наследяване. Множественото наследяване дефинира отношения между независими класове.
Производните класове и наследяването са една от най-важните характеристики на обектно-ориентираното програмиране (ООП). Чрез механизма на наследяване от съществуващ клас се създава нов клас. Класът от който се създава се нарича базов (основен) клас, а този, който е създаден - производен.
Понятията основен и производен клас са относителни, тъй като производен клас може да е основен за други класове, а основен - да е производен от други основни класове. Производният клас може да наследи компонентите на един или няколко базови класа. В първия случай наследяването се нарича единично (просто), а във втория - множествено. Дефинирането на производни класове е еквивалентно на конструирането на йерархии от класове. Защо се налага дефинирането на производни класове? В кои случаи и как се прави това? Какви са предимствата от дефинирането на производни класове? На тези въпроси ще дадем отговор в следващите разглеждания. Ако множество от класове имат общи данни и методи, тези общи части могат да се обособят като основни класове, а всяка от останалите части да се дефинира като производен клас на съответния основен class. Така се прави икономия на памет, тъй като се избягва многократното описание на едни и същи програмни фрагменти. При конструирането на производни класове е достатъчно да се разполага само с обектните модули на основните класове, а не с техния програмен код. Това позволява да бъдат създавани библиотеки от класове, които да бъдат използвани при създаването на производни класове.
Конструктори и деструктори
При създаването на обекта се извършват определени системи от действия, свързани с разпределянето на паметта и връзката на обекта с програмата. Там могат да се изпълнят и действия необходими на потребителя. При унищожаване на обекта се извършват обратните действия. В 'С++' това се прави автоматично с конструктора ( за създаване ) и десктруктора ( за унищожаване ).
Конструкторите и десктрукторите имат всички качества на обикновени член функции
( с изключение на правото да бъдат използвани в определен момент ) също така и някой специфични качества:
- при създаване на обект те автоматично се създават конструктор, при унищожаване деструктор
- ако създава масив от обекти - горното действие се изпълнява за всички обекти на масива
- конструктора има име, което съвпада с името на класа, може да има или да няма параметри
< име на клас > ( < декл. на параметър > , , , ) / void ) ;
Деструктора няма формални параметри.
~ < име на клас > ( void ) ;
Конструктора и деструктора могат да са (inline)
- програмиста не може да повлияе на типа на върнатата стойност от конструктора деструктора и затова не се записва( конструктора връща this, а деструктора - void )
- конструктора не може да бъде (const), (volatile), (static) или (virtual); деструктора може да е (virtual)
- адресите на входните точки на конструктора и деструктора не могат да се присвояват на указател
- конструктора може да се изпълни явно само при създаване на обект, но той и без това се изпълнява автоматично , и това е безсмислено ; деструктора може да се вика за явно изпълнение когато е необходимо в контекста на обекта в който се унищожава
Конструктора и деструктора могат да се заявят в произволен раздел, но:
- ако са в (private) раздела, само приятелски функции на класа могат да създават/унищожават обекти
- ако са в (protected) раздела, само приятелски член функции на производни класове ( наследници ) могат да създават обекти
- ако са в (public) раздела, то навсякъде могат да бъдат създавани обекти на класа
Ако конструктора е параметризиран при създаването на обект , за параметрите трябва да се подадат аргументи, по следния начин: < име на клас > . < име на обект > ( < аргумент > , , , );
Скобите не се пишат ако конструктора е без параметри. В качество на име се ползва името на обекта за извикване на функция.
За да създадем масив обекти:
- в класа конструктора трябва да е наличен без параметри, като тогава се създава масив като всеки друг
- инициализация на масиви ( пр. : cl k [] = { 1, 2, 3 , 5 }; // аргументи на конструктора )
Програмата включва в класа произволно количество конструктори, но всички трябва да са с различен профил. Ако има конструктори с подразбрани параметри, трябва пак да се избягва съвпадение на профили. Деструктора винаги е един. Ако класа няма конструктор, автоматично му се генерира от компилатора - без параметри, т.нар. подразбран конструктор. За да запишем друг конструктор, трябва да запишем и подразбрания.
Ако искаме създадения обект да се инициализира от друг обект, това се записва така :
( пр. : cl x ; cl y=x; cl y(x); // y ще се инициализира с х )
Ако един обект се инициализира с друг и програмата не предложи конструктор за присвояване или копиране , такъв се предлага автоматично от компилатора.
Прототип на copy конструктор cl ( cl& ) - той е с един формален параметър, който е синоним на обекта; ако е създаден от програмата, може да има и други формални параметри, но те трябва да са с подразбрани стойности, за да се смята че е копи конструктор. Най-удачно е компилатора сам да го създаде. Копи конструктор се ползва автоматично, когато дадена функция връща обект.
Предефиниране на функции
Производният клас може да предефинира функции елементи на базовия клас, ако в производния клас се опише функция елемент със същото име както функция елемент на базовия клас, то версията на тази функция в производния клас предефинира версията от базовия клас, за да се направи достъпна версията на функцията от базовия клас, за производния клас, трябва да се използва бинарната операция за разрешаване на област на действие.



Сподели линка с приятел:





Яндекс.Метрика
Изграждане на класова йерархия е основен механизъм за намаляване сложността на класовете и постигане на полиморфично поведение на обектите 9 out of 10 based on 2 ratings. 2 user reviews.