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.