Tip element in clasa de baza | Tip derivare | Tip elemnt in clasa derivata |
public private protected |
private | private inaccesibil private |
public private protected |
public | public inaccesibil protected |
public private protected |
protected | protected inaccesibil protected |
class EA{
int voltage;
int hertz;
public:
int getVoltage()const {};
int getHertz() const {};
};
class Radio: public EA{};
class Tape: public EA{};
class RadioTape: public Radio, public Tape{};
int main(){
RadioTape rt;
int voltage = rt.getVoltage(); //ambiguitate, exista 2 copii ale lui getVoltage(); eroare la compilare
}
Pentru a evita astfel de situatii se utilizeaza mostenirea virtuala:
class Radio: virtual public EA{};
class Tape: virtual public EA{};
class RadioTape: public Radio, public Tape{};
Felul in care se asigura faptul ca exista o singura instanta a unui membru, indiferent de numarul claselor derivate,
depinde de implementare. Sablonul obiectului in memorie depinde si el de implementare; compilatorul poate rearanja
ordinea in care apar subobiectele mostenite!
O clasa este un nou spatiu de nume; scopul unei functii membru redefinite nu se extinde si in clasele derivate!
Din acest motiv, redefinirea unei functii membru intr-o clasa derivata ascunde versiunea din clasa de baza:
class B{
public:
void func();
};
class D: public B{
public:
void func(int n); //B::func() ascunsa!
};
D d;
d.func(); //eroare de compilare!
d.func(1);//OK
Pentru a supraincarca versiunea din clasa de baza, se injecteaza explicit numele functiei in spatiul de nume al
clasei derivate:
class D: public B{
using B::func;
public:
void func(int n); //D are acum 2 versiuni ale lui func()
};
D d;
d.func(); //OK
d.func(1);//OK
Relatia de prietenie intre clase si functii nu este tranzitiva! Acest lucru este ilustrat in urmatoarea figura:
Polimorfismul este capacitatea unor obiecte diferite de a reactiona de o maniera individuala la un (acelasi) mesaj.
Limbajul C++ dispune de 3 mecanisme statice (la compilare) de polimorfism: supraincarcarea operatorilor, sabloane si
supraincarcarea functiilor (utilizarea unei liste diferite de parametri formali).
Legarea tarzie (late binding) este mecanismul utilizat de functiile virtuale, prin care intelesul unui mesaj
depinde de obiectul care il receptioneaza, tipul exact al obiectului putand fi determinat numai la executie!