Programarea OO ofera mecanismele necesare pentru a construi ierahii de clase. Ea se bazeza pe obiecte (incapsulare, tipuri de data abstracte) si pe mostenire si polimorfism.

O clasa este un tip definit de utilizator (tip abstract); un obiect este o instanta a unei clase.
O data membru statica este partajata de toate instantele unei clase. O functie membru statica poate accesa doar datele membru statice si poate fi invocata chiar si atunci cand nu exista instante ale clasei; ea este in mod esential o functie membru uzuala, care nu poseda un argument implicit, this. Se poate obtine astfel adresa unei functii membru statice. Este ilegal sa se atribuie adresa unei date membru statice unui pointer la membru!

Mostenirea da posibilitatea unei clase sa reutilizeze functionalitatea si interfata unei clase de baza.
Relatia de derivare este implicit privata: se creeaza o noua clasa, care poseda toate datele si functionalitatea clasei de baza, insa acestea sunt ascunse, facand parte din implementarea noii clase. Se utilizeaza atunci cand se doreste reproducerea interfetei, dar NU se doreste tratarea obiectului ca si cum ar fi instanta a clasei de baza. (De obicei compozitia cu obiecte private este mai potrivita.)
Prin derivare privata elementele publice din clasa de baza devin elemente private; ele pot fi expuse, in continuare, prin plasarea numelui lor - fara argumente sau valori returnate- in sectiunea declaratiilor publice (daca este vorba de o functie supraincarcata in clasa de baza, se expun toate versiunile sale).
Prin derivare protejata se creeaza o noua clasa, care poseda datele si functionalitatea clasei de baza, insa acestea sunt ascunse, facand parte din implementarea noii clase. Obiectele clasei derivate pot fi insa tratate ca instante ale clasei de baza!
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
Elementele private ale clasei de baza sunt inaccesibile in clasa derivata, indiferent de tipul derivarii. Elementele protejate, desi private in clasa de baza, sunt totusi accesibile in clasa derivata.

Mostenirea multipla poate conduce la o situatie numita DDD (Dreadful Diamond of Derivation):

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: Prietenia nu este tranzitiva

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!