Advertisement
milanmetal

[C++] Otisak 2

Jun 21st, 2017
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4.  
  5. class A {
  6.  
  7.     protected :
  8.    
  9.         int  x  ;
  10.     public :
  11.    
  12.         A( ) { cout<<"AK";  x = 5 ;}
  13.    
  14.         ~A( ) { cout<<"AD" ; } 
  15.  
  16.          virtual void m( ) { x++ ; cout<<x ; }
  17. } ;
  18.  
  19.  
  20. class B : public A {
  21.     public:
  22.    
  23.         B( ) : A( ) { cout<<"BK" ; }
  24.    
  25.         ~B( ) { cout<< "BD" ; }
  26.  
  27.         void m( ) { x--;  cout<<x ;}
  28. };
  29.  
  30. main( ) {
  31.  
  32.     B   b;
  33.     A a;
  34.  
  35.     b.m( );
  36.     b.m( );
  37.     // BREAKPOINT 1 , sada objekat b ovde ima vrednost 3, 5 je dva puta umanjeno
  38.  
  39.     // objekat a pamti x = 5, objekat je kreiran prije nego su b.m() dvaput umanjili njegovu vrednost
  40.     // ovde je sada x = 5
  41.     A  *pa = &a;
  42.  
  43.     // pozivom nad pokazivacem, poziva se VIRTUELNA metoda objekta a koji se krije iza pokazivaca
  44.     // ovde se X uvecava, postaje 6...
  45.     pa->m();
  46.    
  47.  
  48.     // *pa  =  &b; - ovo bi bilo jednako A = *B, odnosno objektu klase A bi se dodjeljivao pokazivac objekta klase B
  49.     // ---> TO NE MOZE!
  50.     // NA OVAJ NACIN JE IZVRSENO DEREFERENCIRANJE, ODNOSNO *pa ode na adresu na koju "pa" pokazuje i uzme BAS
  51.     // taj sadrzaj sa te adrese.
  52.  
  53.     // na ovaj nacin, menjam sadrzaj pokazivaca "pa", on vise ne pokazuje na objekat klase A, nego na objekat klase B
  54.     // ako je "pa" pokazivac A *pa.
  55.     pa  =  &b; // pokazivac na objekat klase A kome je dodeljena adresa objekta B. ----> dozvoljeno zato sto B sadrzi objekat klase A
  56.  
  57.  
  58.     // JUJUJU,STA SE DESILO...
  59.     // sada posto pa = &b, "pa" kao pokazivac klase A koja je nadklasa klasi B cijeg tipa je dodjeljen objekat pokazivacu "pa"
  60.     // uzima metodu iz PODKLASE, odnosno METODU iz objekta koji je dodjeljen i poslednje stanje objekta b se umanjuje.
  61.     // to je bilo BREAKPOINT 1, 3 se umanjuje i postaje 2.
  62.     //
  63.  
  64.     // kada m nije virtuelna u nadklasi, pozvace je iz NADKLASE jer je pokazivac NADKLASNOG TIPA
  65.     // kada m jeste virtuelna u nadklasi, pozvace iz PODKLASE BEZ OBZIRA sto je NADKLASNOG TIPA.
  66.     (*pa).m( );  
  67.  
  68.     return 0;
  69.  
  70.     // AK konstruktor nadklase A koju B nasledjuje
  71.     // BK konstruktor objekta b
  72.     // AK konstruktor od A a; objekta
  73.     // 4  b.m(), poziva se funkcija iz objekta klase B
  74.     // 3  jos jednom...
  75.     // 6  pa->m(); poziva svoju virtuelnu metodu iz objekta a
  76.     // 2  posto PA sada pokazuje na ojekat b klase B, njegovo poslednje prethodno stanje se umanjuje.
  77.     // AD destruktori obrnutim redom od pozivanja.
  78.     // BD ...
  79.     // AD ...
  80.  
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement