Functii Vituale Suprascriere Polimorfism

download Functii Vituale Suprascriere Polimorfism

of 43

Transcript of Functii Vituale Suprascriere Polimorfism

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    1/43

    1

    #include using namespace std;

    class Baza{protected: int atr1;

    public: Baza(int i):atr1(i){} void afsare(){cout

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    2/43

    "e#area $ Bindin#

    ! conectarea unui apel de 4unctie cu 4unctia in sine (adresa 4unctiei)5

    .6ista doua tipuri de legare:

    7 statia/ti%purie(la compilare)

    7 dina%ia/tarzie(in momentul e6ecutie)

    "e#are statia/ti%purie (earl& bindin#)

    - se realizeaza la compilare$ inainte de rularea aplicatiei

    - de catre compilator si editorul de legaturi (lin8er)

    - in li%ba'ul 9 toate apelurile de 4unctii presupun realizareaunei legaturi statice

    4unctie(); se 4ace legatura intre apel si implementarea

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    3/43

    7 in plus$ in avem 4unctii membre:

    1 - 4unctiile membre ale unei clase primesc adresa obiectului care4ace apelul:

    tip2date ob;

    ob4unctie();

    7 in 4unctie de tipul obiectului de la acea adresa 7 compilatorul sieditorul de legaturi stabilesc daca:

    7 4unctie() e membra a clasei tip2date (e declarata)

    7 este implementata

    7 daca e implementata$ se 4ace legarea statica si se poate apela

    acea 4unctie

    7 daca 4unctia era declarata ca membra a clasei$ dar nu e

    implementata

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    4/43

    !-in cazul apelului prin intermediul pointerilor :

    tip2date2baza &ob!ne tip2date;

    ob->4unctie();

    se intampla acelasi lucru:

    - compilatorul si editorul de legaturi stabileasc daca 4unctiainvocata de un pointer este de tipul acelui pointer(adica daca

    aceasta poate f apelata)- mai e6act$ compilatorul 4oloseste tipul stati al pointerului

    (tipul de care a 4ost declarata variabila) pentru a determina dacainvocarea 4unctiei membre este legala

    - este fresc$ ca$ in cazul in care pointerul poate sa 4oloseasca acea

    4unctie$ orice obiect derivat adresat de acel pointer sa o poatautiliza la randul sau

    tip2date2derivat d;

    ob!?d;

    ob7>4unctie(); tipul pointerului este

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    5/43

    0n programul anterior:

    Baza &bp!ne Baza();

    bp=new Derivata(1,1);//B: spune% a bp aretipul stati: Baza si tipul dina%i:

    Derivata

    bp->afsare();

    //se apeleaza Baza::afsare()

    - legatura intre numele 4unctiei si corpul ei se 4ace in mod static (in

    4unctie de tipul static al lui bp)

    - in acest caz se apeleaza 4unctia afsare() din clasa Baza5

    d l 4 i d f bi l

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    6/43

    D. daa vre% sa apelam 4unctia de afsare pentru obiectul catre care

    pointeaza bp

    !> trebuie sa 4acem o conversie e6plicita a pointerului bp din (Baza&) in

    ("erivata&):

    ((Derivata*)bp)->afsare();

    ast4el incat legatura sa se 4aca pentru tipul de date al obiectului catre

    care pointeaza bp5

    7 aceasta solutie nu e robusta

    7 trebuie mereu sa ne punem problema catre ce tip de obiect pointeaza

    pointerul de tip clasa de baza si sa 4acem conversii e6plicite pentru a

    apela 4unctia dorita

    7 solutia e predispusa erorilor lo#ie

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    7/43

    "e#are dina%ia/tarzie

    7 le#area se 0ae dupa o%pilare, la rulare

    - in 0untie de tipul dina%i al pointerului (tipul obietului

    atre are se pointeaza)

    - se poate realiza doar in ontetul apelului de 0untii prin

    inter%ediul pointerilor

    *entru a 4olosi un ast4el de mecanism$ o%pilatorul trebuie sa fe

    in0or%at ca e6ista posibilitatea ca$ in momentul rularii$ sa se

    doreasca apelarea unei 4unctii de tipul dinamic al obiectului5

    "eoarece nu se cunoaste inca tipul obiectului catre care se va pointa

    de7a lungul e6ecutie programului$ o%pilatorul si lin+erul nu

    trebuie sa i%ple%enteze le#atura statia

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    8/43

    0n e6emplul anterior bp pointa initial catre un obiect de tip Baza si apoi

    catre un obiect de tip "erivata5

    rebuie sa se astepte pana in %o%entul rularii ca sa se a2e are e

    tipul dina%i al pointerului si sa 4oloseasca 4unctia

    corespunzatoare5

    *entru aceasta este nevoie de un semnal introdus in cod 7 >0untii

    virtuale5

    "e#area dina%ia poate f i%ple%entata doar in azul

    li%ba'elor o%pilate3

    #i l d i t

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    9/43

    C

    #include using namespace std;class Baza{protected: int atr1;

    public: Baza(int i):atr1(i){}

    virtualvoid afsare() { cout

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    10/43

    5untii virtuale si suprainararea/suprasriereae este o 0untie virtuala4

    7 4unctiile virtuale sunt cea mai importanta caracteristica a limbaului3@@ (pdpv al *EE)

    - 4unctiiile virtuale permit claselor derivate sa inlocuiascaimplementarea metodelor din clasa de baza 9

    suprasriere/suprainarare/override

    uprasrierea/suprainararea 0untiilor*resupune ca intr7o ierar6iede clase sa avem:

    1 0untii u aelasi nu%e, se%natura si tip returnat in lasa debaza si derivate

    5 dar u i%ple%entari speife lasei din care 4ac parte (ganditi7vala afsare() din Baza si "erivata )

    F5 4unctii declarate ca virtuale

    Daa 1,!,7 =>0untii suprainarate

    "aca 1 si 9 4unctii redefnite

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    11/43

    8n azul 0untiilor virtuale:

    7 compilatorul se asigura ca i%ple%entarea 6e%ata este cea pentru

    tipul dina%i al obiectului care 4ace apelul5

    B: 3and avem un pointer de tipul clasei de baza care adreseaza un

    obiect$ obiectul poate f de tipul clasei de baza sau derivate5

    (9:Baza& care pointeaza initial catre un obiect de tip Baza si apoi catre

    un obiect de tip "erivata5)

    -e poate vorbi de doua tipuri in cazul pointerului bd:

    - stati7 tipul pointerului (Baza&$ in acest caz)

    - dina%i 7 tipul obiectului catre care pointeaza (intai Baza apoi"erivata)5

    3ompilatorul nu are cum sa prevada catre cine pointeaza bp de7a lungul

    implementarii 7 asa ca nu stie (pana in momentul rularii) care 4unctie de

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    12/43

    8nsaeste in4ormat sa nu implementeze o legatura timpurie intre apelul

    afsare() si corpul 4unctiei de afsare din Baza$ ci sa astepte pana in

    momentul rularii prin cuvantul c%eie virtual pus in 4ata 4unctiei

    afsare()5

    +st4el$ prin le#area dina%ia sau tarzie (late$dnamic binding)$ la

    e6ecutiei se va decide care e tipul dinamic al pointerului si se va 4ace

    legarea cu implementarea din clasa precizata de tipul dinamic5

    "e#area dina%ia se poate 0ae doar 0olosind 0untii

    virtuale si pointeri

    2222222222222222222222222222222222222222222222222222222222222222222222222

    B: 0ntr7o ierar%ie de clase este normal ca obiectele rezultate (de tip

    baza si derivate) sa aiba comportamente similare (nu identice)$ iarcomportamentele sa fe specializate in 4unctie de tipul clasei5

    .6: 0ntr7o clasa derivata vrem sa afsam toate atributele acelei clase$ nu

    doar cele mostenite din clasa de baza$ dar 4unctia se va numi tot

    afsare$ va ascunde implementarea din clasa de baza$ si va avea uncom ortament un ic di4erit5

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    13/43

    bservatii:

    15 5untiile %e%bre nevirtuale sunt tratate stati 9 in momentul

    compilarii : in 4unctie de tipul static al pointerului se vor apela metodele

    specifce acelui tip static de date5

    5 5untiile %e%bre virtuale sunt tratate dina%i9 in momentul

    rularii : in 4unctie de tipul dinamic al obiectului se 4ace legatura apel

    4unctie7corp 4unctie5

    bservati a aeasta presupune elusiv apelul prin

    inter%ediul pointerilor

    3ele F elemente necesare implementarii acestui comportament:

    - adresarea obietelor (de tip baza sau derivate) prin pointeri

    de tip lasa de baza

    - apelul de 0untii virtuale

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    14/43

    "e#area dina%ia $ be6ind t6e urtains

    "upa cum am spus in 3H 7 marea parte a ImunciiJ cand vine vorba de

    derivare este 4acuta de compilator$ acelasi lucru se intampla si canddeclaram o 4unctie membra a unei clase 9 ca virtuala5

    3uvantul c%eie virtual in4ormeaza compilatorul sa nu realizeze olegatura statica5

    0n sc%imb$ trebuie sa puna in actiune toate mecanismele necesarerealizarii de legaturi dinamice5

    *entru aceasta compilatorul creaza un tabel numit

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    15/43

    9:Baza &&vector!ne Baza&'F; Baza &vector 'F;vector'M!ne Baza(1); vector'1!ne "erivata($); vector'!ne Baza(F);

    vtable Baza

    vector

    vtable "erivata

    4or (int i!M;i

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    16/43

    bservatii in e priveste di%ensiunea tipurilor de date are au0untii virtuale si viteza de apel a 0untiilor virtuale

    15*entru e6emplele anterioare testam di%ensiunea obietelor:

    7 in cazul in care nu a% 0untia de afsare delarata virtuala:

    Baza b; "erivata d; cout

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    17/43

    bservatii privind rearea

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    18/43

    3e se intampla daca avem urmatoarea ierar%ie declasesi avem un vector:9: Baza &&vector!ne Baza&'F;vector'M!ne Baza(1);

    vector'1!ne "erivata1(1$);vector'! ne "erivata($F$N);

    4or (int i!M;icit2val();

    =class Baza= %as no member named =cit2val=// s-a trun6eat

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    19/43

    e#uli derivate:

    15 Qu pot avea constructori virtuali5

    De e4

    *K este initializat in constructor5 3onstructorul$ daca era 4unctie virtuala$

    trebuia sa aiba adresa accesibila prin *K$ dar *K inca nu e initializat5

    (*ot ma6im sa 4ac niste 4unctii virtuale care sa mimeze comportamentul

    unui constructor virtual5)

    5 La apelul unei 4unctii virtuale$ in constructor se apeleaza versiunea

    locala a 4unctiei5

    Gecanismul asociat virtual nu 4unctioneaza in constructor pentru ca:a5 rolul onstrutorului e de a rea obietul5

    b5 in constructor$ obietul poate f partial 0or%at; e6: se stie care e

    obiectul de baza$ nu si ce clase urmeaza sa fe derivate5

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    20/43

    c5 initializarea

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    21/43

    - *entru e6emplul de pana acum$ in care nu implementam niciun

    destructor$ se generau automat destructori pentru toate clasele din

    ierar%ie5- "eci se va apela de F ori destructorul pentru tipul de date static al

    elementelor vector'i$ adica se apeleaza de F ori destructorul de tip

    Baza

    D.: noi trebuie sa eliberam spatiu pentru obiecte de tip "erivata1 si

    "erivata5

    - *entru a se putea 4ace acest lucru$ in clasa Baza trebuie sa declaram

    destructorul ca find 4unctie virtuala:

    virtual HBaza()A

    - ast4el toti destructorii claselor derivate vor avea comportament de

    4unctii virtuale$ c%iar daca sunt generati automat de compilator5

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    22/43

    oli%orfs% si 0untii virtuale

    - IpoliJ 9 mai multe; Imor4J 94orma

    oli%orfs%ulse poate realiza prin:

    - supradefnirea 0untiilor 7 4unctii cu acelasi nume$ dar

    semnaturi di4erite 7 care se comporta di4erit in 4unctie de conte6t

    9 in 4unctie de modul in care sunt apelate;polimorfsm ad hoc

    - suprainararea 0untiilor 9 4unctii virtuale: acelasi obiect

    poate sa aiba comportamente di4erite la apelul unei metode$ in

    4unctie de tipul lui dinamic

    E clasa in care se declara o metoda virtuala$ sau care e derivatadin alta clasa care contine o metoda virtuala se numeste lasa

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    23/43

    Daa sunt asa de i%portante, de e nu 0olosi% elusiv 0untii

    virtuale4 De e nu realizeaza deat le#aturi dina%ie4

    - pentru ca legarea dinamica nu este la 4el de efcienta ca legarea

    statica (asa ca o 4olosim cand e nevoie)

    33@@ este un limba preocupat de efcienta

    in Aava toate legaturile apel 4unctie 7 corp 4unctie sunt realizate

    dinamic (nu sunt vizibili pointerii si 4unctiile virtuale)

    Daa nu sunt la 0el de efiente - and 0olosi% 0untii virtuale4

    "e fecare data cand vrem ca in clasa derivata sa

    modifcamadaptamsuprascriem comportamentul unei 4unctii dea

    implementate in clasa de baza5

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    24/43

    and este i%portant aest %eanis%4

    15 Sunctiile virtuale sunt 4olosite pentru a implementa polimorfsmulin momentul rularii ( Kun time *olmorp%ismI)5

    5 ,n alt avanta al 4unctiilor virtuale este ca permit realizarea deliste neo%o#ene de obiecte

    F5 "ezvoltarea de biblioteci in spiritul *EE5

    ! "iste neo%o#ene:

    ipul static al obiectelor din lista este tipul de baza$ dar obiectelestocate pot f de orice tip derivat sau baza5

    Eperatiile e4ectuate pe lista pot f 4acute 4ara testarea tipuluiobiectului$ deoarece e6ista garantia ca metodele apelate sunt celede tipul dinamic al obiectelor5

    B %

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    25/43

    Baza5%#pragma once#include using namespace std;

    class Baza{protected:

    int atr1;public:

    Baza(); Baza(int );

    void set2atr1(int ); virtualvoid afsare();

    virtualTBaza(){};};Baza5cpp#include Baza5%

    Baza::Baza() { }

    Baza::Baza(int i):atr1(i) { }

    void Baza::set2atr1(int i) { atr1!i; }

    void Baza::afsare() { cout

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    26/43

    "erivata5%#pragma once#include Baza5%class "erivata: public Baza{

    protected: int atr;public:

    "erivata(); "erivata(int $ int ); void set2atr(int ); void afsare(); afsare din "erivata e virtuala

    };destructorul generat automat e virtual

    "erivata5cpp#include "erivata5% "erivata::"erivata() { }

    "erivata::"erivata(int a1$ int a):Baza(a1)$atr(a) { }

    void "erivata::set2atr(int n) { atr ! n; }

    void "erivata::afsare() { Baza::afsare(); cout

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    27/43

    #include "erivata5%

    int main(int argc$ c%ar &argv'){ int n;

    cout>tip; i4 (tip!!M){ cout>a1; cin>>a; vec'i!ne "erivata(a1$a);

    } else i77;

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    28/43

    4or (int i!M;i

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    29/43

    F5 -a consideram urmatorul scenariu:-. trebuie implementata o ierar6ie de lase-. sa consideram varianta in care$ pentru fecare clasa se defneste o

    4unctie membra .fsare() nevirtuala5

    +ceasta implementare are un dezavanta maor din punct devedere al dezvoltarii ulterioare a aplicatiilor: intrea#a ierar6iede lase trebuie reo%pilatadaca se %ai adau#a o noualasa u o 0untie %e%bra .fsare (care se doreste virtuala)$si aceasta indi4erent daca implementarile sunt in fsiere sursadi4erite sau nu5

    +cesta este un dezavanta maor$ pe de7o parte datorita e4ortuluide compilare$ dar si din ratiuni de mar8eting5

    -a presupunem ca un producator so4tare vrea sa implementezeierar%ia de clase discutata mai sus si sa o vanda5

    3umparatorul utilizatorul doreste ca pe baza claselor dinbiblioteca$ sa7si dezvolte propriile aplicatii$ pastrand insa 4unctia+fsare in implementarea lor5 -i mai mult doreste ca 4unctia de+fsare sa fe virtuala (ceea ce inseamna ca ar trebui sa modifce

    %eaderul clasei de baza din ierar%ie si sa recompileze toate clasele)5

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    30/43

    De e este insa neesara reo%pilarea tuturor

    i%ple%entarilor (a tuturor laselor)4

    .6plicatia provine de la modurile standard in care compilatorul poate

    distinge intre 4unctii cu acelasi nume (pana acum am vazut F asemeneamoduri):

    7 4unctiile di4era prin lista de argumente

    7 se 4oloseste operatorul de rezolutie ::$ prin care se distinge intre

    4unctii redefnite in clasele derivate- se 4ace distinctie dupa tipul obiectului pentru care a 4ost apelata

    4unctia5

    oate aceste distinctii (rezolutii) se 4ac insa la compilare$ legare

    timpurie (statica)5

    0n clipa in care declaram 4unctia de afsare virtuala$ trebuie compilate

    inca o data toate clasele$ iar %eanis%ul de le#are statia este

    inlouit peste tot pe unde apare 0untia .fsare u el de le#are

    dina%ia

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    31/43

    0n mod normal$ utilizatorului trebuie sa i se 4urnizeze niste fsiere

    5% (cu defnitiile claselor) si niste fsiere 5ob $ 5o sau 5lib (cu

    implementarile gata compilate)$ pe baza carora sa dezvolte noi

    tipuri de date$ sa deriveze noi clase din cele e6istente dea 5

    *rin legarea tarziedinamica (late sau dnamic binding)$ adica prin

    intermediul 4unctiilor membre virtuale se poate rezolva problema

    4urnizarii surselor5

    E 4unctie virtuala +fsare ascunsa intr7o clasa de baza B

    precompilata nu este legata la obiectele din clasa B ca o 4unctie

    membra obisnuita5

    *utem crea o clasa " derivata din B si suprascrie o 4unctie +fsarepentru clasa "5

    "aca se compileaza modulul nou de program si se lin87editeaza cu

    modulul 5E5EBA sau 5L0B anterior dezvoltat$ apelurile 4unctiei

    +fsare se vor 4ace corect$ fe pentru obiectele din clasa B$ feentru cele din clasa "5

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    32/43

    "aca se doreste dezvoltarea in continuare a acestei ierar%ii$ nu mai estenevoie sa recompilez mereu codul pentru clasele Baza si "erivata$ atatatimp cat nu modifc implementarea sau %eaderele$ ci trebuie doar sainclud %eaderele si modulele obiect in noul proiect5

    Daa apliatia avea di%ensiuni %ult %ai %ari, se salva %ultti%p $ a0erent reo%pilarii

    *roect 7> *roect Eptions 7> *arameters 7> +dd Librar or

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    33/43

    *roect > *roect Eptions > *arameters > +dd Librar orEbect

    #i l d tdlib

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    34/43

    #include #include using namespace std;#include "erivata5%

    class "erivata2dupa2cumparare:public "erivata{ int atrF;public:

    "erivata2dupa2cumparare(int i$ int $ int 8):"erivata(i$)$atrF(8) {}

    void afsare() { "erivata::afsare(); cout

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    35/43

    Reguli generale:

    15 -e recomanda sa se declare ca virtuale$ 4unctiile care$ in

    derivari ulterioare Q, isi sc%imba semnifcatia (acelasi

    nume$ semnatura$ tip returnat)$ ci doar li se modifca

    adapteaza implementarea comportamentul (in 4unctie de noul

    tip de date)5

    5 "aca o clasa are macar o 4unctie virtuala$ destructorul

    trebuie declarat virtual5

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    36/43

    .6emplu amplu; este reluata aplicatia din materialul anteriorcomp2deriv:

    +dresa c%ar &str int nr

    *ersoana +dresa adr c%ar& nume

    +ngaat +dresa adr c%ar& nume

    mostenite double salariu

    agregare %as a

    derivare is a

    reau sa pot sa creez un vector care sa contina si persoane si angaati(lista neomogena) si sa pot sa 4ac afsarea tuturor atributelor obiectelor4ara sa imi pun probleme legate de tip5

    l +d {

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    37/43

    class +dresa { private: c%ar& str; int nr;

    public:

    +dresa();+dresa(c%ar&$ int);+dresa(const +dresa?);

    +dresa? operator!(const +dresa ?); 4riend ostream? operator

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    38/43

    class +ngaat:publi ersoana { private:

    double salariu;public: +ngaat();

    +ngaat(const +dresa ?$ c%ar&$double);+ngaat(c%ar& $ int $ c%ar& $ double );

    +ngaat(const +ngaat ? ); +ngaat? operator!(const +ngaat ? ); void afsare();e virtuala};

    int main()

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    39/43

    int main(){

    int n; cin>>n;

    c%ar &num!ne c%ar'M;

    c%ar &str!ne c%ar'M; int nr; double sal;

    bool &t!ne bool'n; 7nu mai e nevoie de un vector in care memorezdaca persoana e angaata sau nu

    ersoana *&evidenta!ne ersoana*'n;un vector in care vreau sa stoc%ez atat obiecte de tip *ersoana& cat si+ngaat&

    4or (int i!M;i

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    40/43

    {coutnum;

    coutstr; coutnr;

    evidentaFiG=new ersoana(str,nr,nu%); }

    }cout

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    41/43

    #include using namespace std;#include

    class Sig2geom{ protected: c%ar &nume; public: Sig2geom(){nume!ne c%ar'strlen(IE SiguraI);})@1; strcp(nume$ IESiguraI);}

    Sig2geom(const c%ar&n){nume!ne c%ar'strlen(n)@1;strcp(nume$n);}

    Sig2geom(const Sig2geom ?n){ &t%is!n; }

    Sig2geom? operator!(const Sig2geom ?n){ nume!ne

    c%ar'strlen(n5nume)@1; strcp(nume$n5nume);

    return &t%is;}

    void afsare(){ cout

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    42/43

    class *atrat:public Sig2geom{ double lat; public: *atrat(c%ar&n$double i):5i#C#eo%(n) { lat!i; }

    *atrat(const *atrat? i):5i#C#eo%(i) { lat!i5lat; }

    *atrat? operator!(const *atrat? i) { (5i#C#eo%?)(*t6is)=i;lat!i5lat; return &t%is; }

    double arie() A return lat*lat; //pot sa o 0a private4

    };

    class 3erc:public Sig2geom{ double raza; public:

    3erc(c%ar&n$double i):5i#C#eo%(n) { raza!i; }

    3erc(const 3erc? i):5i#C#eo%(i) { raza!i5raza; }

    3erc? operator!(const 3erc? i) { (5i#C#eo%?)(*t6is)=i;raza!i5raza; return &t%is; }

    int main()

  • 7/25/2019 Functii Vituale Suprascriere Polimorfism

    43/43

    int main() { Sig2geom && v!ne Sig2geom&'F; v'M!ne Sig2geom(punct); v'1!ne *atrat(patrat 1$);

    v'!ne 3erc(cerc 1$F);

    4or (int i!M;iafsare(); //dar afsare nu e virtuala@ //- nu, dar apeleaza o 0untie virtuala si este

    %ostenita de // toate lasele derivate3 Lu osuprasriu pentru a 0ae // %ereu aelasi luru;doar aria se aluleaza alt0el

    cout