7.1. Clase derivate

7.1. Clase derivate

A venit timpul s? cre?m pe baza clasei fractie_rationala o clas? derivat? care va mo?teni de la cea de baz? toate propriet??ile ?i va avea ?n plus ni?te propriet??i ?i posibilit??i noi. ?n mod normal, vom ad?uga la frac?ia pozitiv? ra?ional? simpl? partea ?ntreag?. Posibil, a?a se face ?i la ?coal? c?nd se studiaz? cursul de algebr? elementar?. Aceast? clas? derivat? vom numi-o rational_fara_semn.

Lu?m ultima versiune a programului cu clasa fractie_rationala; ?tergem din ea func?ia main() ?i scriem restul (includeri, defini?ia clasei, defini?iile func?iilor membre ?i a celor prietene) ?n fi?ierul cu numele ”fr.cpp”. Acest fi?ier va fi inclus permanent ?n exemplele care vor urma.

Cre?m un fi?ier nou cu numele ”rfs.cpp” ?n care vom scrie urm?torul cod:

// includem fi?ierul cu defini?ia clasei de baz?
#include "fr.cpp" 
// Clasa derivat? include numere ra?ionale f?r? semn (pozitive)
class rational_fara_semn: public fractie_rationala
{
   protected:
      unsigned int part_int;
};
 
void main()
{
   rational_fara_semn a, b;
   cout << "a=" << a << endl;
   cout << "b=" << b << endl;    char ch; cin >> ch;
}

Fiind lansat, acest program va afi?a urm?toarea ie?ire:

a=0/1
b=0/1

?ncerc?m s? ne descurc?m ?n ceea ce a fost f?cut.

?n primul r?nd, am creat o clas? nou? cu denumirea rational_fara_semn, ?ns? ea nu a fost creat? pe loc gol, ci pe baza clasei fractie_rationala (anume construc?ia ": public fractie_rationala" indic? la aceasta). Ceea ce ?nseamn? c? clasa rational_fara_semn mo?tene?te de la clasa fractie_rationala. Clasa de la care se mo?tene?te se nume?te clas? de baz?, sau clas? p?rinteasc?, sau superclas?. Clasa care mo?tene?te se nume?te clas? derivat?, sau clas? mo?tenitoare, sau subclas?.

Fiecare obiect al clasei derivate rational_fara_semn va con?ine c?mpurile numarat ?i numit, mo?tenite de la clasa de baz?, ?i c?mpul part_int, care a fost ad?ugat ?n sec?iunea protected la definirea clasei rational_fara_semn. ?n acest c?mp se va p?stra partea ?ntreag? a num?rului ra?ional. C?mpurile numarat ?i numit r?m?n protejate ?i ?n clasa derivat?, precum au ?i fost ?n clasa de baz?. Despre aceasta ne spune cuv?ntul public situat ?nainte de numele clasei de baz?  la definirea  clasei  derivate  (acest  mecanism  va  fi  explicat ?n 7.3).

?n clasa derivat? rational_fara_semn nu a fost ad?ugat? nici o func?ie membr?. Aceasta ?nseamn? c? ea va mo?teni f?r? suprascriere toate func?iile membre ale clasei de baz? (?ns? nu constructorii ?i destructorul care nu se mo?tenesc, ?i func?ia eroare() care nu va fi accesibil? ?n clasa derivat?, deoarece ea este privat? ?n clasa de baz?).

?n afar? de aceasta, ?n clasa derivat? vor fi definite implicit un constructor f?r? parametri rational_fara_semn() ?i un destructor ~rational_fara_semn(). ?n exemplul nostru acest constructor va fi apelat automat ?n func?ia main() o dat? la crearea obiectului a ?i a doua oar? – la crearea obiectului b. Destructorul va fi apelat pentru fiecare din aceste obiecte la ie?ire din func?ia main().

Constructorul implicit nu face nimic ?n afar? de apelarea constructorului clasei de baz?. Acest lucru este asigurat de c?tre compilator. Constructorul clasei de baz? va fi apelat f?r? argumente (adic?, ?n cazul nostru cu valorile implicite pentru ambele argumente). Ca rezultat, c?mpurile numarat ?i numit vor fi puse respectiv pe 0 ?i 1 la ambele obiecte (a ?i b). C?mpul part_int va r?m?ne neini?ializat la ambele obiecte, fiindc? ?n constructorul implicit al clasei derivate nu este prev?zut? nici o ini?ializare.

Dac? clasa de baz? fractie_rationala nu ar avea nici constructorul f?r? parametri, nici constructorul cu valorile implicite pentru to?i parametrii, programul din acest exemplu nu ar fi compilat. Pur ?i simplu, compilatorul nu ar avea posibilitatea de a apela constructorul de baz? din constructorul implicit al clasei derivate.

Destructorul implicit al clasei derivate la fel nu face nimic, ?n afara apelului automat al destructorului clasei de baz?. Lucru care va fi asigurat de c?tre compilator. Ne vom aduce aminte c? destructorul clasei de baz? fractie_rationala nu face nimic.

Dup? cum s-a spus, ?n clasa rational_fara_semn nu a fost suprascris? nici o func?ie membr? mo?tenit? de la clasa fractie_rationala. Aceasta ?nseamn? c?, lucr?nd cu obiectele clasei derivate, fiecare din aceste func?ii vor afecta numai c?mpurile mo?tenite, precum ele ar lucra cu obiectele clasei de baz?. ?i toate celelalte func?ii, fie c? sunt sau nu prietene ale clasei de baz?, primind obiectele derivate vor lucra cu ele precum cu obiectele de baz?. De aceea, ?n instruc?iunile:

cout << "a=" << a << endl;
cout << "b=" << b << endl;

pentru a transmite obiectele a ?i b ?n streamul de ie?ire, va fi apelat? func?ia care supra?ncarc? operatorul << pentru clasa de baz?. Fiind aplicat? la obiectele clasei rational_fara_semn, aceast? func?ie va afi?a doar num?r?torul ?i numitorul, neav?nd idee c? obiectele clasei derivate mai au ?nc? un c?mp. Acum este clar? ie?irea afi?at? de c?tre programul exemplului nostru.

De asemenea a devenit clar c? multe func?ii ale clasei de baz? trebuie s? fie suprascrise ?n clasa derivat?. Va trebui de supra?nc?rcat ?i func?iile prietene ale clasei de baz?. Dar ?n primul r?nd trebuie definit constructorul clasei derivate. Adic?, clasa rational_fara_semn cere o dezvoltare esen?ial?, ?ns? lucrul acesta va fi f?cut, pe pa?i, ?n sec?iunile urm?toare.

?n baza clasei rational_fara_semn putem crea alte clase derivate, iar ?n baza lor – alte, ?i a?a mai departe. Procesul nu este limitat ?i poate fi ?ntins ?n timp, ?mpr??tiat prin diferite fi?iere, executat de diferi?i programatori etc.

Pentru exemplu, cre?m ?n baza clasei rational_fara_semn clasa derivat? rational, la care vom ad?uga semnul num?rului ra?ional, permi??nd, astfel, posibilitatea de a lucra ?i cu numere ra?ionale negative. Inser?m ?n programul exemplului nostru, dup? declararea clasei rational_fara_semn, urm?torul cod:

// Clasa derivat? – numere ra?ionale
class rational: public rational_fara_semn
{
   private:
      char semn;
};

cu declararea de machet? a clasei derivate rational, care mo?tene?te nemijlocit de la clasa rational_fara_semn. Dup? cum observ?m, s-a mai ad?ugat un c?mp nou, cu numele semn, destinat pentru p?strarea semnului num?rului ra?ional. Am inclus acest c?mp anume ?n sec?iunea private special pentru exemplu, ca s? avem o clas? cu c?mpul privat.

Din celelalte considerente, locul c?mpului dat era mai potrivit ?n sec?iunea protected. Pentru clasa rational clasa fractie_rationala va fi un str?mo?. Clasa rational va fi dezvoltat? ?n cele ce urmeaz?, ?n paralel cu clasa rational_fara_semn.
_________________________
Autorul: dr.conf. S. Pereteatcu

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов