Documente Academic
Documente Profesional
Documente Cultură
2011
Compoziţia şi moştenirea
Compoziţie
Moştenirea
class A {
Mostenirea este mecanismul prin care un limbaj de
private programare redă relaţiile ierarhice dintre abstracţiuni.
int ax, ay; O clasa care este mostenita se numeste clasa de baza.
public: O clasa care mosteneste este numita clasa derivata.
A() : ax(0), ay(0) {} Clasele alfate intr-o relatie de mostenire formeaza
A(int x, int y) : ax(x), ay(y) { } impreuna o ierarhie de clase.
}; class B { • Forma generala a unei clase aflate intr-o relatie de
private: mostenire (simpla) este:
A a; • class nume-clasa-derivata : specificator-acces
int bz; nume-clasa-baza {
public: // corpul clasei
B(int x=0, int y=0, int z=0) : A(x,y), bz(z) {} };
}
Exemplu comtinuare
• #include <iostream.h • class Imaginary: public Complex {
#include <math.h class Complex {
friend class Imaginary; public:
friend class Double; Imaginary(double i = 0): Complex(0, i) { }
public: Imaginary(const Complex &c): Complex(0, c.ipart) { }
Complex(double r = 0, double i = 0): rpart(r), ipart(i) { } Imaginary& operator=(const Complex &c) {
Complex(const Complex &c): rpart(c.rpart), ipart(c.ipart) { } rpart = 0; ipart = c.ipart; return *this;
Complex& operator=(const Complex &c) {
rpart = c.rpart; ipart = c.ipart; return *this; }
} };
Complex operator+(const Complex &c) const {
return Complex(rpart + c.rpart, ipart + c.ipart);
} • class Double: public Complex {
friend Complex operator+(double d, const Complex &c) { public:
return c + Complex(d); Double(double re = 0): Complex(re) { }
} Double(const Complex &c): Complex(c.rpart) { }
... Double& operator=(const Complex &c) {
operator double() {
return sqrt(rpart*rpart + ipart * ipart;) rpart = c.rpart; ipart = 0; return *this;
private: }
double rpart, ipart; };
};
Observatii
• In ambele clase derivate (Imaginary si Double) a fost definit cate un operator de
Constructorii si Mostenirea
atribuire avand ca operand drept un obiect al clasei de baza, pentru a caror
implementare a fost necesar accesul la structura privata a clasei de baza. Din acest
motiv cele doua clase au fost declarate ca friend in clasa de baza. Discutia legata de • Ordinea Executiei Constructorilor
acest fapt este prezentata mai jos. La creare unui obiect al unei clase derivate se excuta urmatoarele
operatii:
• Constructorii claselor derivate, apeleaza explicit anumiti constructori ai clasei de • 1. Aloca memorie. Se aloca necesarul de memorie pentru o
baza. Relatia intre constructorii/destructorii clasel de baza si ai celor derivate, precum
si cazul in care este necesar apelul explicit al constructorilor clasei de baza este instanta a acelei clase.
explicat deasmenea intr-una din sectiunile urmatoare ale acestei lucrari. 2. Apeleaza constructorul clasei de baza. Constructorul clasei
derivate, apeleaza automat constructorul clasei sale de baza. Desi
• Specificatorul de acces la clasa de baza modifica statutul in clasa derivata a acest lucru nu necesita interventia programatorului, acesta poate
membrilor din clasa de baza in conformitate cu urmatoarele reguli: interveni pentru a controla apelul contructorului de baza. Daca clasa
• Regula 1: Membrii private din clasa de baza sunt intotdeauna inaccesibili in clasele de baza nu se afla in varful ierarhiei, aceasta va apela la randul ei
derivate. constructorul clasei sale de baza.
• Regula 2: Membrii protected din clasa de baza raman protected daca mostenirea 3. Initializeaza datele-membru de tip obiect. Constructorul clasei
este cu acces public, si devin private daca mostenirea este cu acces private.
derivate va initializa automat datele-membru de tip obiect definite in
• Regula 3: Membrii public din clasa de baza raman public daca mostenirea este cu
acces public, si devin private daca mostenirea este cu acces private. clasa. Acest lucru se face implicit prin invocarea constructorului
implicit pentru acele obiecte. Acest lucru poate fi modificat, prin
• Cand una dintre clasele derivate are nevoie in mod exceptional sa acceseze structura intermediul unei liste de initializare.
interna (declarata privat) a clasei de baza, ea va fi declarata friend in clasa de baza. 4. Executa constructorul clasei derivate. Dupa ce au fost
initializate obiectele membru ale clasei, se executa corpul
constructorului din clasa derivata.
1
18.10.2011
Redefinirea functiilor-membru.
continuare
• class Auto • class Truck: public Auto
• { • {
• public: // constructori • public: // constructori
• Truck ();
• Auto ();
• Truck (int engine_wt, int sp, char const *nm, int trailer_wt);
• Auto (int wt, int sp, char const *nm); • void setname (char const *nm);
• Auto (Auto const &other); // constructorul copy • int getweight () const;
• Auto const &operator= (Auto const &other); // asignarea • private: // data
• ~Auto (); // destructorul • int trailer_weight;
• };
• // interfata
• // examplu de constructor
• char const *getname () const; • Truck::Truck (int engine_wt, int sp, char const *nm,
• void setname (char const *nm); • int trailer_wt): Auto (engine_wt, sp, nm)
• private: // data • {
• char const *name; • trailer_weight = trailer_wt;
• }
• };
2
18.10.2011
continuare
• class Patrat : public Patrulater {
public:
Patrat(double l1 = 0.0) : Patrulater(l1,l1,l1,l1) {}
double perimetru() { return 4*laturi[0]; }
double arie() { return laturi[0]*laturi[0]; }
};
• void f(Patrulater &p) { ... }
• Main()
• {
• Patrulater *ppater, pater;
Dreptunghi *pdrept, drept;
Patrat *ppatrat, patrat;
• pdrept = &drept;
ppatrat = &patrat;
• // dar si atribuirile ...
• ppater = &drept; // atribuie adresa
pater = patrat; // atribuite obiect
• f(drept);
• }