Mostenirea
Mostenirea este un concept al programarii cu obiecte. Mostenirea ne permite sa cream clase care sunt derivate din alte clase existente, astfel incat ele includ unii dintre membri claselor parinte, variabile si functii. Clasa derivata mosteneste membrii clasei parinte, functii si variabile. In acest fel putem construi programe complexe din obiecte simple. Clasa care este mostenita se numeste clasa de baza sau superclasa, iar clasele care mostenesc se numesc clase derivate sau subclase. Clasa de baza contine caracteristicile comune ale mai multor elemente. Clasele care mostenesc sunt clase particulare ce adauga doar elementele proprii. Cu ajutor 949c22j ul mostenirii reutilizam clase deja construite.
Diagrama sintactica a definirii unei clase derivate este
class nume_clasa_derivata : acces nume_clasa_baza
;
In aceasta definitie cuvantul cheie acces poate fi public, protected sau private.
O clasa derivata mosteneste toti membri clasei de baza exceptand constructorii, destructorul si operatorul =. Desi constructorii nu sunt mosteniti, constructorul implicit si destructorul clasei de baza sunt totdeauna apelati cand un obiect de tipul clasei derivate este creat sau distrus. In constructorul clasei derivate se apeleaza la inceput constructorul implicit al clasei de baza. Daca este nevoie, putem apela explicit un constructor al clasei de baza pentru initializarea variabilelor. Apelarea sa se face astfel
constructor_clasa_derivata(lista de parametri) : constructor_clasa_de_baza (lista de parametri)
class Base
;
Se va defini o clasa Pixel ce descrie un pixel pe ecran si mosteneste clasa Base. Un pixel este caracterizat de coordonatele punctului (care sunt cele din clasa Base) si culoare ce va fi o variabila de tip intreg din clasa Pixel.
class Pixel : public Base
;
Se va defini o functie globala ce va descrie un pixel translat cu valorile dx, dy, cu prototipul :
translate(Pixel&, int dx, int dy);
Coordonatele noului punct sunt x + dx si y + dy.
#include<iostream.h>
class Base
Base(int x1, int y1) ;
void print();
class Pixel: public Base
Pixel() : Base();
friend void translate(Pixel &p,int dx,int dy);
void printp();
void translate(Pixel &p,int dx,int dy)
void main()
Rezultatele rularii programului sunt cele de mai jos.
Mentionam ca am definit variabilele clasei de baza h si b de tipul protected.
Datele si functiile declarate protected in clasa de baza pot fi utilizate in clasele derivate, dar nu pot fi utilizate de obiecte.
Datele si functiile declarate private in clasa de baza nu pot fi utilizate in clasele derivate sau de obiecte de tipul claselor derivate.
Tabela de mai jos sumarizeaza accesului la variabilele unui obiect in functie de specificatorii lor.
specificatorul de acces al variabilei |
|||
public |
protected |
private |
|
Membri ai aceleiasi clase |
da |
da |
da |
Membrii claselor derivate |
da |
da |
nu |
Nemembri |
da |
nu |
nu |
Problema 2. Sa se defineasca o clasa Ratio ce descrie numere rationale ce mosteneste din clasa Base. Numaratorul si numitorul numarului rational vor fi variabilele x si y din clasa Base. Programul ce rezolva problema este urmatorul.
class Ratio : public Base
Se vor defini functii globale care sa adune si sa scada numere rationale cu prototipurile
Ratio add(Ratio&, Ratio&);
Ratio sub(Ratio&, Ratio&);
Ratio mul(Ratio&, Ratio&);
Fie numerele intregi a = 2 / 5, b = 3 / 7, c = - 4 / 3, d = -1 / 1. Se vor calcula expresiile a + b, a + b * c, (a + b) / (a + d). Programul ce rezolva problema este urmatorul.
#include<iostream.h>
class Base
;
Base(int x1, int y1) ;
void print();
class Ratio : public Base
;
// se va observa modul de apel al constructorului din clasa
// de baza in clasa derivata
Ratio(int x1, int y1): Base(x1,y1);
friend Ratio add(Ratio a, Ratio b);
friend Ratio sub(Ratio a, Ratio b);
friend Ratio mul(Ratio a, Ratio b);
friend Ratio div(Ratio a, Ratio b);
};
Ratio add(Ratio a, Ratio b)
Ratio sub(Ratio a, Ratio b)
Ratio mul(Ratio a, Ratio b)
Ratio div(Ratio a, Ratio b)
void main()
Rezultatele rularii programului sunt cele de mai jos.
Problema 3. Sa se defineasca o clasa de baza numita Persoana ce contine un camp nume cu numele persoanei si o functie print() ce afisaza numele. Functia print() va fi virtuala. Programul ce rezolva problema este urmatorul.
class Persoana
virtual void print()
};
Sa se defineasca o clasa numita Angajat ce mosteneste clasa Persoana. Clasa va contine un camp cu numele departamentului si o functie print() ce va afisa numele angajatului si numele departamentului. Definitia clasei este cea de mai jos.
class Angajat : public Persoana
void print()
};
Sa se defineasca o clasa numita Manager ce mosteneste clasa Angajat. Clasa va contine un camp cu pozitia managerului si o functie print() ce va afisa numele, departamentul si pozitia managerului. Definitia clasei este cea de mai jos.
class Manager : public Angajat
void print()
};
Se vor crea obiecte cu angajati si manageri si se vor afisa datele acestora (numele, departamentul si pozitia manageriala). Programul de rezolvare a problemei este prezentat mai jos.
#include<iostream.h>
#include<string.h>
class Persoana
virtual void print()
};
class Angajat : public Persoana
void print()
};
class Manager : public Angajat
void print()
};
int main()
Rezultatele rularii programului sunt cele de mai jos.
Probleme propuse
Sa se defineasca o clasa Baza care contine doua variabile de tip double cu specificatorul de acces protected. Clasa va defini un constructor cu parametri si un constructor implicit, fara parametri. Se va defini o clasa Complex ce va implementa numere complexe. Clasa Complex va mosteni clasa Baza si va defini un constructor cu parametri, un constructor implicit fara parametri, o functie care prescrie valorile partiilor reala si imaginara a numarului complex si o functie care scrie pe ecran numarul complex sub forma
(partea reala, partea imaginara)
Se va defini o functie globala care sa adune douǎ numere complexe.
|