Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Nasledjivanje i nasledjene funkcije

[es] :: C/C++ programiranje :: Nasledjivanje i nasledjene funkcije

[ Pregleda: 3330 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.221.EUnet.yu.



+9 Profil

icon Nasledjivanje i nasledjene funkcije15.09.2005. u 19:39 - pre 226 meseci
Dakle..ovako, da ne bih pejstovao ceo kod ovde..evo kako glasi problem..ukratko:

- Imamo klasu A
- U klasi A se npr. nalazi javna funkcija void goranche()
- Imamo klasu B koja javno nasledjuje klasu A

Zatim kazemo sledece:
Code:

A *objekat = new B;
A *novi_objekat = new A;


Ovi objekti mogu da pozovu i pozivaju funkciju goranche.
Code:

objekat->goranche();
novi_objekat->goranche();


Sada sledi pitanje!:) Da li je moguce IZ TELA funkcije goranche ustanoviti da li je nju pozvao objekat ili novi_objekat da bi se naknadno uveo uslov sta da se desi u jednom, a sta u drugom slucaju?

Valjda sam dobro objasnio... :))

[Ovu poruku je menjao Goran Arandjelovic dana 15.09.2005. u 20:40 GMT+1]
 
Odgovor na temu

igac
Banjaluka

Član broj: 415
Poruke: 562
*.dip.urc.bl.ac.yu.



+2 Profil

icon Re: Nasledjivanje i nasledjene funkcije15.09.2005. u 20:51 - pre 226 meseci
napravis u izvedenoj klasi void goranche() koja ce raditi posao za "novi_objekat" :) a za stari objekat ostaje "prava" fja goranche() :) tzv override

[Ovu poruku je menjao igac dana 15.09.2005. u 21:52 GMT+1]
"nice town, i'll take it..."
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.198.eunet.yu.



+9 Profil

icon Re: Nasledjivanje i nasledjene funkcije15.09.2005. u 21:40 - pre 226 meseci
Kad bi to tako islo... :) Ne moze to tako. Ako pozovem takvu f-ju iz izvedenog objekta izvrsice se f-ja iz osnovne klase ;) Od kada override ide sa istim argumentima? :))
 
Odgovor na temu

Gogy

Član broj: 14618
Poruke: 35
*.cmu.carnet.hr.



Profil

icon Re: Nasledjivanje i nasledjene funkcije15.09.2005. u 22:38 - pre 226 meseci
Samo u osnovnoj klasi stavi funkciju goranche() kao virtualnu i onda u izvedenoj napisi istu funkciju koja ce raditi posao za izvedeni objekat.

evo ti primjer:

Code:

#include <cstdlib>
#include <iostream>

using namespace std;

class goran1{
      public:
             virtual void goranche(){                 
                   cout<<"goranche1()"<<endl;                           
                  }
      };
      
class goran2 : public goran1{
      public:
            void goranche(){
                 cout<<"goranche2()"<<endl;
                 }
      };

int main(int argc, char *argv[])
{
    goran1* g2=new goran2;
    goran1* g1=new goran1;
    
    g1->goranche();
    g2->goranche();
    
    
    system("PAUSE");
    delete g2;
    delete g1;
    
    return EXIT_SUCCESS;
}


Nadam se da je to ono sto si trazio.

[Ovu poruku je menjao Gogy dana 15.09.2005. u 23:41 GMT+1]
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Nasledjivanje i nasledjene funkcije16.09.2005. u 05:47 - pre 226 meseci
Koliko vidim, VCL ima ugradjen virtuelni mehanizam kojim mozes da pitas o kojoj
klasi se radi, pa npr, mozes i ti tako nesto da izmislis. Pretpostavljam da ljudi
znaju zasto to tako rade:

// NETESTIRANO !!!

--- H ---
Code:

class a
{
public:
    void foo();
    virtual AnsiString getClassName();
};

class b : public a
{
public:
    virtual AnsiString getClassName();
};


--- CPP ---
Code:

AnsiString a::getClassName()
{
    return "a";
}

AnsiString b::getClassName()
{
    return "b";
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    a *o1 = new a;
    a *o2 = new b;

     o1->foo();
     o2->foo();

    delete o1;
    delete o2;
}

void a::foo()
{
    ShowMessage("foo() pozvana iz " + getClassName());
}


Mada, trebalo bi da radi i ovako, bez ovoga:

// NETESTIRANO !!!

--- CPP ---

Code:

 if ( dynamic_cast<b*>(this) != NULL )
    ShowMessage( "foo() pozvana iz b" );
 else
    ShowMessage( "foo() pozvana iz a" );
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.varmdo.se.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Nasledjivanje i nasledjene funkcije16.09.2005. u 10:13 - pre 226 meseci
Moguc odgovor na pitanje lezi u tehnologiji koja se zove RTTI (Run-time type information). Vise o tome na http://www.ictp.trieste.it/~ma...-plusplus/c++_ug/RTTI.doc.html .
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Nasledjivanje i nasledjene funkcije16.09.2005. u 10:17 - pre 226 meseci
Evo sada sam i probao... Izgleda da ovaj drugi primer, nece da radi ako foo() nije
virtualna:

Code:

class a
{
   public:
   virtual void foo(); // <--- STAVIO SAM VIRTUAL, INACE PRIJAVLJUJE NEKE GRESKE I KOD BCB-a I KOD DEV C++
};

class b : public a
{
};


Ovo dalje, po starome:

Code:

 if ( dynamic_cast<b*>(this) != NULL )
    cout << "foo() pozvana iz b";
 else
    cout << "foo() pozvana iz a";


Ipak, moja odluka bi bila onaj prvi primer sa metodom koja ti lepo kaze koja je
klasa... Takve mehanizme koriste i profesionalci...

Mislim da je to to, u suprotnom jedino vidim nacin da se napravi neki low-level
mehanizam za traganje po steku, ali to je onda diskusija o asemblerima.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bowneglobal.com.



+6 Profil

icon Re: Nasledjivanje i nasledjene funkcije16.09.2005. u 13:21 - pre 226 meseci
Ja bih poslušao Igca i Gogyja da sam na tvom mestu. Takođe, pogledaj ovo:

http://www.parashift.com/c++-faq-lite/virtual-functions.html

[Ovu poruku je menjao Dragi Tata dana 16.09.2005. u 14:21 GMT+1]
 
Odgovor na temu

[es] :: C/C++ programiranje :: Nasledjivanje i nasledjene funkcije

[ Pregleda: 3330 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.