XXI. Diel C++ - Triedy II. - Dedičnosť

Michal Kyžňanský  /  03. 03. 2006, 00:00

Pokračujeme ďalšou podkapitolou – dedičnosťou. Dedičnosť nám umožňuje vytvoriť triedy podľa vzoru už vytvorenej a teda dediť po nej vlastnosti. Je to ďalší z veľmi dôležitých princípov, objektovo orientovaného programovania v C++. Pustime sa do toho.

Dedičnosť je v skratke povedané, možnosť vytvoriť podľa už vytvorenej triedy novú, konkrétnejšiu triedu, ktorá zdedí po základnej triede všetky metódy a premenné. Je to skvelý spôsob ako vytvoriť znovu použiteľný kód, ktorý je nielen overený, a teda neobsahuje žiadne chyby, ale si z neho môžeme vybrať len to čo chceme bez potreby opätovného deklarovania, ktoré by bolo nielen nepraktické, ale tiež zbytočne by program zaťažovalo.
Odvodzovanie od základnej triedy sa robí spôsobom:

class základná trieda : definovanie prístupu + nová odvodená trieda {
}



Znamená to, že v deklarácii musíme uviesť najprv základnú triedu a operátorom : naznačíme, že ideme vytvoriť od nej odvodenú novú triedu. Za operátorom : nasleduje public/private/protected. Každé z týchto troch označení je špecifické. Začneme deklaráciu klasickej triedy s názvom pocitac, od ktorej budeme neskôr odvodzovať triedy, ktoré budú reprezentovať komponenty.

class pocitac{  

protected:
int koeficient_predaja;

public:
int cena;
int spotreba;
int zaruka;
AnsiString velkosklad;
int priem_cena_kompon (int suma, int pocet_komp);
};


C++ jazyk umožňuje dediť aj privátne, alebo aj chránené položky, ku ktorým je potom možno pristupovať pomocou externých metód základnej funkcie. O tomto si však povieme v iných pokračovaniach C++ programovania. Vytvorenie novej triedy na základe starej – základnej bude jednoduché a pomocou operátora : dáme programu na vedomie, že chceme zdediť určité vlastnosti po už vytvorenej triede. Takto bude vyzerať príklad triedy procesor, ktorá zdedí všetky vlastnosti triedy pocitac, ale bude akýmsi vylepšením – konkrétnejším objektom.

class procesor : public pocitac{  

private:
AnsiString nazov_vyrobcu;

public:
int frekvencia;
int cacheL1, cacheL2;
AnsiString instrukcie;
int multiplier;
};


Po takomto deklarovaní má trieda procesor prístup k public dátam triedy pocitac, teda je jej potomkom. Umiestnime si na formulár Button komponent pre jednoduchú demonštráciu prístupu triedy procesor k zdedeným položkám triedy pocitac. Chýba nám ešte deklarovanie a vyplnenie tela funkcie priem_cena_kompon a ošetrenie udalosti Button1Click, ktoré bude obsahovať deklarovanie premenných typu trieda a použitie vyššie spomínanej funkcie.

int priem_cena_kompon (int suma, int pocet_komp){  

return (suma/pocet_komp);
} void __fastcall

TForm1::Button1Click(TObject *Sender) {

pocitac moj;
procesor novy;
ShowMessage(priem_cena_kompon(37594,4));
}


Konštruktor v odvodených triedach



Explicitný konštruktor sa definuje a deklaruje v odvodených triedach inak ako iba v klasickej triede. Postup môže vyzerať veľmi mätúco, ale treba sa posadiť k tým na prvý pohľad neznámym riadkom kódu a postupne sa začnú súvislosti vynárať. Ide o to, že máme dve triedy s dvoma vlastnými deklaráciami explicitných konštruktorov. Deklarácia konštruktoru prvej triedy je klasická, ale odvodená trieda má vo svojej deklarácii konštruktoru zahrnuté aj zdedené prvky po základnej triede. Deklarácia prvej triedy spolu s deklaráciu konštruktoru je nasledovná:

class pocitac{  

protected:
int koeficient;

public:
int cena;
int spotreba;
int zaruka;
AnsiString velkosklad;

pocitac(
int ccena,
int sspotreba,
int zzaruka,
AnsiString vvelkosklad);

int priem_cena_kompon (int suma, int pocet_komp);
};


Deklarácia druhej triedy je už zložitejšia:

class procesor : public pocitac{  

private:

AnsiString nazov_vyrobcu;

public:
int frekvencia;
int cacheL1, cacheL2;
AnsiString instrukcie;
int multiplier;

procesor(
int ccena,
int sspotreba,
int zzaruka,
AnsiString vvelkosklad,
int ffrekvencia,
int ccacheL1,
int ccacheL2,
AnsiString iinstrukcie,
int mmultiplier);
};


Horšie je to však s definíciou konštrukorov. Prvá definícia, ktorá patrí konštruktoru hlavnej triedy od ktorej odvodzujeme našu druhú triedu je klasická, ako sem si to ukazovali v minulom dieli. Ale definícia explicitného konštruktoru druhej odvodenej triedy procesor je dá sa povedať špecifická z toho hľadiska, že je nutné akoby skĺbiť definíciu konštruktora aj triedy pocitac aj triedy procesor do jednej.

Teraz príde na radu definícia konštruktorov:

pocitac :: pocitac
(int ccena,
int sspotreba,
int zzaruka,
AnsiString vvelkosklad){

cena = ccena; //priraďovanie hodnôt jednotlivým parametrom
spotreba = sspotreba;
zaruka = zzaruka;
velkosklad = vvelkosklad;
}



Druhý explicitný konštruktor vyzerá takto:

procesor :: procesor(
int ccena,
int sspotreba,
int zzaruka,
AnsiString vvelkosklad,
int ffrekvencia,
int ccacheL1,
int ccacheL2,
AnsiString iinstrukcie,
int mmultiplier) : pocitac(ccena,sspotreba,zzaruka,vvelkosklad){

frekvencia = ffrekvencia;
cacheL1 = ccacheL1;
cacheL2 = ccacheL2;
instrukcie = iinstrukcie;
multiplier = mmultiplier;
}


A konečne si do formulára vložíme komponentu Memo, do ktorej vypíšeme aspoň zpár z parametrov, ktore explicitný konštruktor vytvoril.

void __fastcall TForm1::Button1Click(TObject *Sender) { 

procesor *moj;
moj = new procesor(9874,89,36,"Agem",2200,64,512,"3DNow!SSESSE2",12);

Memo1->Lines->Add(moj->frekvencia);
Memo1->Lines->Add(moj->cacheL1);
Memo1->Lines->Add(moj->cacheL2);
Memo1->Lines->Add(moj->instrukcie);
}


V budúcom dieli budeme pokračovať v problematike tried.

 

Súvisiace články:

Prehľad všetkých dielov

Neprehliadnite: