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 d
voma 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: