260 likes | 365 Views
Mo ştenirea claselor. Programarea calculatoarelor şi limbaje de programare II Capitolul 5. Obiective. Înţelegerea modului în care se pot crea clase noi prin moştenirea din clasele existente Înţelegerea modului în care moştenirea promovează reutilizarea codului
E N D
Moştenirea claselor Programarea calculatoarelor şi limbaje de programare II Capitolul 5
Obiective • Înţelegerea modului în care se pot crea clase noi prin moştenirea din clasele existente • Înţelegerea modului în care moştenirea promovează reutilizarea codului • Înţelegerea noţiunilor de clasă de bază şi clasă derivată
Introducere • Moştenirea este o formă de reutilizare a codului în care noile clase sunt create din clase existente prin • absorbirea atributelor şi comportamentelor lor • prin înlocuirea unor comportamente • prin adăgarea unor atribute şi comportamente noi • Reutilizarea codului economiseşte timp preţios în dezvoltarea software
Introducere • O clasă moşteneşte datele membre şi funcţiile membre dintr-o clasă de bază definită anterior • Noua clasă este o clasă derivată • Moştenirea se foloseşte la crearea unei noi clase asemănătoare uneia existente pentru a nu rescrie complet datele membre şi funcţiile membre • Fiecare clasă derivată poate deveni, mai departe, un candidat pentru derivări ulterioare
Introducere • Moştenirea simplă • o clasă este derivată dintr-o singură clasă de bază • Moştenirea multiplă • o clasă este derivată din mai multe clase de bază • Limbajul C++ oferă trei tipuri de moşteniri • public • fiecare obiect al unei clase derivate poate fi folosit oriunde se foloseşte un obiect al clasei de bază din care a fost derivată acea clasă • un obiect din clasa derivată este şi obiect al clasei de bază • protected • private
Introducere • O relaţie „has a” înseamnă compunere de clase • un obiect al unei clase are ca membri unul sau mai multe obiecte ale altor clase • O relaţie „is a” este o moştenire • obiectele unei clase derivate pot fi tratate şi ca obiecte ale clasei de bază
Sumar • Moştenirea: clase de bază şi clase derivate • Membrii protected • Folosirea funcţiilor membre • Suprascrierea membrilor clasei de bază în clasele derivate • Moştenirea public, protected şi private • Clase de bază directe şi clase de bază indirecte
Moştenirea: clase de bază şi clase derivate • Adeseori, un obiect al unei clase este un obiect al altei clase în acelaşi timp • Un dreptunghi este un patrulater, la fel ca şi un pătrat, un paralelogram sau un trapez • Clasa Dreptunghi moşteneşte clasa Patrulater • Clasa Patrulater-clasă de bază • Clasa Dreptunghi- clasă derivată
Moştenirea: clase de bază şi clase derivate • Exemple Clasa de bază Clase derivate Forma Cerc Triunghi Dreptunghi Credit CreditAuto CreditImobiliar Cont ContCurent ContDepozit ContPlati
Forma FormaBidimensionala FormaTridimensionala Cerc Triunghi Patrat Sfera Cub Moştenirea: clase de bază şi clase derivate • Exemplu • Moştenirea conduce la relaţii între clase care poti fi reprezentate prin structuri arborescente • Un obiect al clasei Cerc este în acelaşi timp şi o FormaBidimensionala, dar şi o Forma class FormaBidimensionala : public Forma { ... };
Sumar • Moştenirea: clase de bază şi clase derivate • Membrii protected • Folosirea funcţiilor membre • Suprascrierea membrilor clasei de bază în clasele derivate • Moştenirea public, protected şi private • Clase de bază directe şi clase de bază indirecte
Membriiprotected • Membrii public ai unei clase de bază pot fi accesaţi de orice funcţie din program • Membrii private al unei clase de bază sunt accesibili doar funcţiilor membre sau prietenilor clasei • Membrii protected ai unei clase de bază pot fi accesaţi doar de • membrii şi de prietenii clasei de bază • de membrii şi prietenii claselor derivate
Membriiprotected • Datele protected depăşesc ideea de încapsulare pentru că o schimbare a membrilor protected din clasa de bază poate influenţa toate clasele derivate • se recomandă ca datele membre să fie declarate private • protected trebuie folosit numai atunci când este strict necesar
Sumar • Moştenirea: clase de bază şi clase derivate • Membrii protected • Folosirea funcţiilor membre • Suprascrierea membrilor clasei de bază în clasele derivate • Moştenirea public, protected şi private • Clase de bază directe şi clase de bază indirecte
Folosirea funcţiilor membre • O clasă derivată nu poate accesa direct membri private ai clasei de bază • Acesta este un aspect crucial de inginerie software in C++ • Dacă o clasă derivată ar putea accesa membrii private ai clasei de bază, s-ar încălca principiul încapsulării pentru obiectele clasei de bază • Dacă o clasă derivată ar putea accesa membrii private ai clasei sale de bază, atunci clasele care sunt derivate mai departe din clasele derivate pot accesa şi ele aceşti membri şi aşa mai departe • Propagarea accesului la datele private ar anula astfel beneficiile încapsulării datelor în cadrul unei ierarhii de derivare
Sumar • Moştenirea: clase de bază şi clase derivate • Membrii protected • Folosirea funcţiilor membre • Suprascrierea membrilor clasei de bază în clasele derivate • Moştenirea public, protected şi private • Clase de bază directe şi clase de bază indirecte
Suprascrierea membrilor clasei de bază în clasele derivate • Override • O clasă derivată poate suprascrie o funcţie membră a clasei de bază printr-o nouă versiune a acestei funcţii cu aceeaşi semnătură • Când numele acestei funcţii este menţionat în clasa derivată, este selectată automat versiunea din clasa derivată • Overload • Semnăturile sunt diferite
Suprascrierea membrilor clasei de bază în clasele derivate • Exemplu class Employee { public: Employee(const char*, const char*); void print() const; ~Employee(); private: char* firstName; char* lastName; };
Suprascrierea membrilor clasei de bază în clasele derivate class HourlyWorker : public Employee { public: HourlyWorker(const char*, const char*, double, double); double getPay() const; void print() const; private: double wage; double hours; }; Funcţia print este suprascrisă
Suprascrierea membrilor clasei de bază în clasele derivate void HourlyWorker::print() const { cout << "Se executa HourlyWorker::print()\n\n"; Employee::print(); cout << " este un lucrator angajat cu ora platit cu " << setiosflags(ios::fixed | ios::showpoint) << setprecision(2) << getPay() << " EUR" << endl; } int main() { HourlyWorker h("Bob", "Smith", 40.0, 10.00); h.print(); return 0; } Apelul functiei print din clasa de baza Se executa HourlyWorker::print() Bob Smith este un lucrator angajat cu ora platit cu 400.00 EUR
Sumar • Moştenirea: clase de bază şi clase derivate • Membrii protected • Folosirea funcţiilor membre • Suprascrierea membrilor clasei de bază în clasele derivate • Moştenirea public, protected şi private • Clase de bază directe şi clase de bază indirecte
Moştenireapublic, protected şi private • Pentru membrii public din clasa de bază • Moştenire public • public în clasa derivată • Poate fi accesat direct prin orice funcţie membră nestatică, funcţie friend sau funcţie nemembră • Moştenire protected • protectedîn clasa derivată • Poate fi accesat direct prin orice funcţie membră nestatică sau funcţie friend • Moştenire private • privateîn clasa derivată • Poate fi accesat direct prin orice funcţie membră nestatică sau funcţie friend
Moştenireapublic, protected şi private • Pentru membrii protected din clasa de bază • Moştenire public • protected în clasa derivată • Poate fi accesat direct prin orice funcţie membră nestatică sau funcţie friend • Moştenire protected • protectedîn clasa derivată • Poate fi accesat direct prin orice funcţie membră nestatică sau funcţie friend • Moştenire private • privateîn clasa derivată • Poate fi accesat direct prin orice funcţie membră nestatică sau funcţie friend
Moştenireapublic, protected şi private • Pentru membrii private din clasa de bază • Moştenire public • Inaccesibil în clasa derivată. • Poate fi accesat direct prin orice funcţie membră nestatică sau funcţie friend prin funcţii membre public sau protected din clasa de bază • Moştenire protected • Inaccesibil în clasa derivată. • Poate fi accesat direct prin orice funcţie membră nestatică sau funcţie friend prin funcţii membre public sau protected din clasa de bază • Moştenire private • Inaccesibil în clasa derivată. • Poate fi accesat direct prin orice funcţie membră nestatică sau funcţie friend prin funcţii membre public sau protected din clasa de bază
Sumar • Moştenirea: clase de bază şi clase derivate • Membrii protected • Folosirea funcţiilor membre • Suprascrierea membrilor clasei de bază în clasele derivate • Moştenirea public, protected şi private • Clase de bază directe şi clase de bază indirecte
Clase de bază directe şi clase de bază indirecte • Clasă de bază directă a unei clase derivate • este listată explicit în header-ul clasei derivate, după semnul : • Clasă de bază indirectă • nu este listată explicit în header-ul clasei • este moştenită cu două sau mai multe nivele înainte în ierarhia de moştenire