Intr-o clasa de baza folosim specificatorul virtual pentru a-i spune compilatorului ca vom suprascrie metoda respectiva. Sa luam un exemplu:
class A
{
virtual f1(){cout<< "f1A";}
f2(){cout<< "f2A";}
};
class B:A
{
f1(){cout<< "f1B";}
f2(){cout<< "f2B";}
f3(){cout<< "f3B";}
};
Pentru urmatoare secventa de cod programul ne va afisa f1B, f2B, f3B (ceea ce era si de asteptat, clasele sunt instantiate clar, nimic deosebit):
B b;
b.f1();
b.f2();
b.f3();
Specificatorul virtual este folositor daca lucram in felul urmator:
A* b;
b=new B;
b->f1();
b->f2();
b->f3();
In primul rand eroare la compilare: f3 nu se regaseste si in A, si cum b este declarata de tipul A compilatorul se ataca.
Output-ul va fi: f1B, f2A.
In primul rand - pot declara o variabila ca pointer la clasa de baza si s-o instantiez cu o clasa derivata. Insa asa pot apela doar metodele care exista in clasa de baza (fie ca le-am suprascris sau nu). La fel, daca functia o suprascriem cu mai multi parametri in clasa derevivata vom avea eroare la compilare. Clasa de baza trebuie mostenita public.
In al doilea rand - in momentul in care apelez o functie din b, conteaza daca aceasta a fost declarata in clasa de baza ca fiind virtuala sau nu. Daca a fost declarata virtuala, se apeleaza metoda suprascrisa din clasa derivata. Daca nu este virtuala, chiar daca este suprascrisa in clasa derivata, va fi apelata metoda din clasa de baza.
Clasele care au metode virtuale se numesc clase polimorfice.
Putem avea metode virtuale pure - metode care doar sunt declarate in clasa de baza, fara a fi implementate:
class A
{
virtual int funt()=0;
};
O clasa care contine metode virtuale pure se numeste clasa abstracta. Nu putem crea o instanta a acestei clase, trebuie neaparat sa o derivam si sa implementam metodele virtuale pure.
TEMA LABORATOR:
Sa presupunem ca avem doua produse: bond si swap.
1. Bond este caracterizat prin nume, nr de zile total, zile scurse si valoare initiala, valoare curenta.
2. Swap este caracterizat prin nume, valoare initiala, valoare datorata, indice, valoare curenta.
Valoarea curenta se calculeaza in modul urmator:
1. valoare initiala + (valoare intiala* zile scurse/nr total de zile)
2. valoare initiala + (valoare datorata * indice)
Initial, pt 1. zile scurse = 0 si pt 2. indice = 10%.
Sa se realizeze un program care sa ofere utilizatorului urmatoarele optinui:
a. introdu bond
b. introdu swap
c. ziua urmatoare
In momentul in care se alege c. se afiseaza calculeaza valoarea curenta pentru fiecare produs, se afiseaza numele si valoarea curenta pentru fiecare produs, si pt 1. se incrementeaza zile scurse cu 1 iar pt 2. indice *=0.01
Abonați-vă la:
Postare comentarii (Atom)
Niciun comentariu:
Trimiteți un comentariu