Documente Academic
Documente Profesional
Documente Cultură
RTTI
CURS 8 - PROGRAMARE II
CUPRINS
Motenire Funcii pur virtuale
Clase abstracte
Motenire multipl Clase de baz virtuale RTTI
MOTENIRE (INHERITANCE)
Definiie Motenirea este un mecanism care permite unei clase A s moteneasc atribute i metode ale unei clase B. n acest caz obiectele clasei A au acces la membrii clasei B fr a fi nevoie s le redefinim
Terminologie
Clas de baz
Clasa care este motenit
Clas derivat
O clas specializat a clasei de baz
MOTENIRE
Sintax
class NumeleClaseiDerivate : modificatorDeAccess NumeleClaseiDeBaz
unde
modificatorDeAcces specific tipul derivrii private (valoare implicit) protected public
CLASE ABSTRACTE
Definiie Dac o clas conine o funcie pur virtual ea se numete abstract
class A { public: virtual void x() = 0; virtual void y() = 0; }; class B : public A { public: virtual void x(); }; class C : public B { public: virtual void y(); }; int main () { A * ap = new C; ap->x (); ap->y (); delete ap; return 0; };
Multipl
MOTENIRE MULTIPL
Definiie Motenirea este multipl dac o clas are dou sau mai multe clase de baz Sintax class ClasaDerivat : [modificatorDeAcces] ClasaDeBaza1, [modificatorDeAcces] ClasaDeBaza2, [modificatorDeAcces] ClasaDeBazaN { }; Crete flexibilitatea ierarhilor de clase ierarhii n form de graf
class AnimalInaripat { };
class Liliac: public Mamifer, protected AnimalInaripat { Liliac():AnimalInaripat(), Mamifer() { } };
10
Problema: o instan a clasei de baz Animal este inclus de dou ori clasa derivat Liliac (una de la clasa Mamifer i una de la clasa Animalnaripat), ceea ce duce la: Pierderi la alocarea spaiului de memorie (toate atributele sunt duplicate) Ambiguiti: probleme de accesare a membrilor clasei Animal
11
EXEMPLU
class Animal { };
class Mamifer: public Animal { }; class AnimalInaripat: public Animal { };
class Liliac: public virtual Mamifer, protected virtual AnimalInaripat { Liliac():Animal(), Manifer(), AnimalInaripat() { . } };
12
Liliac l; l.varsta;
13
RTTI - TYPEID
Operatorul typeid este utilizat pentru a determina clasa obiectului n momentul execuiei Dac obiectul este NULL se arunc o excepie de tip std::bad_typeid Utilizare Const std::type_info & info = typeid(object)
14
RTTI - TYPEID
class Animal {
virtual ~Animal();
};
int main() { Animal a; Mamifer m; Animal *pa =&m; cout << typeid(a).name() <<endl; //Animal (determinat static la compilare)
cout<<typeid(*pa) .name() <<endl; //Mamifer (determinat dinamic la execuie deoarece este un pointer la o clas polimorfic) }
15
virtual ~Animal();
};
16
CURS VIITOR
abloane
17