[ Predrag Damnjanovic @ 03.10.2002. 14:45 ] @
Imam:
Code:

        void *p=new covek;
        ((covek *)p) -> cao ();


Ovo radi.
E sad pitanje, da li mogu da ovo isto radim (da zovem cao()) a da pri tome ne navodim tip pointera?
Dakle nesto kao :
p -> cao ();

Naravno, bitno mi je da ne navodim klasu, jer hocu da menjam objekte, tj. p bi morao da pokazuje i na klasu covek, i na klasu zivotinja...

Hocu da napravim niz od void pointera:
void *p[10];
i posle samo da kazem
p[n] -> show();
a da pritom ne vodim racuna koje je klase objekat na koga p pokazuje.

[Ovu poruku je menjao Predrag Damnjanovic dana 04.10.2002. u 12:59 GMT]
[ alex @ 03.10.2002. 15:54 ] @
Hmm, ako ti neces da vodis racuna o tome koje je klase objekat na koga pointer pokazuje, kako mislis da ce kompajler znati na sta ti mislis?

Moras da navodis tip objekta, jer kompajler ne moze da zna na koji ti objekat mislis kada pozivas njegove metode.

A zasto p mora da ti bude void? Da li on-the-fly menjas tip objekta ili sta? ajd, malo pojasni...
[ Predrag Damnjanovic @ 03.10.2002. 16:00 ] @
Pa ne mora da bude void.
Meni je samo bitno da pristupam objektima koji imaju f-ju koju ja trazim, dakle svi da imaju show().
Dejan Lozanovic spominje neko 'nasledjivanje' ?
[ Preeky @ 03.10.2002. 16:09 ] @
Najbolje bi ti bilo da napravish apstraktnu klasu zivo_bice recimo
iz nje izvedesh druge klase i kasnije kreirash pointer na objekat tipa zivo bice i u njeha mozesh da alocirash objekat bilo koje druge izvedene klase sa new

znaci:

zivo_bice *t = new covek;
ili
zivo_bice *t = new zivotinja;

kad u toku rada koristish t->nesto()
uvek ce da bude pozvana ispravna funkcija trenutnog objekta


Znaci klasicni polimorfizam sa virtuelnim funkcijama.


[ Milan Aksic @ 03.10.2002. 16:17 ] @
Ako ne zelis na ovaj nacin mozes umesto void pointera, da koristis polimorfizam. Napravis baznu klasu iz koje izvodis ostale klase.
Npr. imas baznu (Bice) i dve izvedene klase (Covek i Zivotinja). Naravno osnovne funkcije clanice su viruelne, tako da ih overloadujes u izvedenim klasama (a i nemoras, postoji i drugi nacin, ako pomeris funkcionalnost u baznoj klasi).
Onda napravis objekte.
Code:

class Bice
{
    public:
      virtual void Show() = 0;
};

class Covek : public Bice
{
    public:
        void Show() { cout << "Covek!\n"; }
};

class Zivotinja : public Bice
{
    public:
       void Show() { cout << "Zivotinja\n"; }
};

void main()
{
       Bice* p[2];

       p[0] = new Covek;
       p[1] = new Zivotinja;

       p[0]->Show();
       p[1]->Show();
}
[ Predrag Damnjanovic @ 03.10.2002. 17:36 ] @
Hvala svima!
[ tOwk @ 04.10.2002. 15:27 ] @
Hm, samo jedno pitanje.

Zar ,,apstraktne klase'' i ,,klase sa virtuelnim funkcijama'' ne predstavljaju istu stvar sa drugim imenima? Praktično različita terminologija, a ne suština.

(Radi razjašnjenja mojeg osrednjeg poimanja OOP terminologije)
[ Milan Aksic @ 04.10.2002. 15:43 ] @
Po mom skromnom znanju, da.
[ Ivan Tanasic @ 04.10.2002. 19:23 ] @
I po mom skromnom znanju da :) samo sto ovo abstraktne dolazi od javinog abstract, a ovo sa virtuelnim funkcijama iz c++a

[ Dejan Lozanovic @ 04.10.2002. 20:10 ] @
Citat:
tOwk:
Hm, samo jedno pitanje.

Zar ,,apstraktne klase'' i ,,klase sa virtuelnim funkcijama'' ne predstavljaju istu stvar sa drugim imenima? Praktično različita terminologija, a ne suština.

(Radi razjašnjenja mojeg osrednjeg poimanja OOP terminologije)

Ni govora, rec je od dva razlicita pojma, ne mozes kreirati objekat od abstraktne klase. Dok klasa moze da ima ima virtuelne funkcije a da ne bude abstraktna.
[ Časlav Ilić @ 05.10.2002. 08:15 ] @
Apstraktna klasa je klasa sa virtuelnim funkcijama kod koje bar jedna virtuelna funkcija ima deklaraciju, ali nema definiciju (apstraktna funkcija). Deklaracija takve funkcije se završava se =0. Na primer:

Code:
[blue]
class shape
{
...
virtual void draw (int x, int y) =0;
...
};

Pošto apstraktna klasa ima nedefinisane funkcije, ne može se napraviti objekat njenog tipa. Svaka klasa koja je nasleđena od apstraktne, takođe je apstraktna ako se u njoj ne definišu sve apstraktne funkcije.
[ tOwk @ 05.10.2002. 11:19 ] @
Časlave i Dejane zahvaljujem na razjašnjenju (a ovima što znaju jednako slabo kao i ja, zahvaljujem na pokušaju :)

Jedino je nezgodno što ste se usredsredili na opis apstraktnih klasa (koje su mi poznate, i stoga i jasne), umesto na pojam ,,virtuelne funkcije''.

Zastarelo pitanje, pronašao sam odgovor na Osnove OOP-a, ne baš jasan, ali poslužio je:
Zato, možete li malo pojasniti virtuelne funkcije: čemu služe, i koje su njihove prednosti?
[ Časlav Ilić @ 05.10.2002. 12:20 ] @
Citat:
tOwk:

Zato, možete li malo pojasniti virtuelne funkcije: čemu služe, i koje su njihove prednosti?
Moraću da dam odgovor koji baš ne volim, ali stvarno je tako: pitanje je preširoko da bi se ovde odgovorilo na njega.

Mogu samo da te posavetujem da pročitaš neki duži tekst o tome, sa puno primera kako se koriste u dizajnu programa. Samo kratak opis o tome kako rade nije dovoljan.

Predlažem knjigu "Thinking in C++" od Brusa Ekela, besplatna je u elektronskom obliku i može se naći na www.bruceeckel.com. Ima je u html obliku i kod mene u lokalu: http://home.drenik.net/caslav/ticpp.zip (1706 kB)
[ Dragi Tata @ 05.10.2002. 17:52 ] @
http://www.parashift.com/c++-faq-lite/virtual-functions.html
[ Milan Aksic @ 05.10.2002. 18:08 ] @
Da, ja sam malo pomesao. Moja greska. Generalno ADT postaje, kada se u deklaraciji klase ukljucuju jedna ili dve cistih virtelnih funkcija (virtual void print(void) = 0;} Ciste virtuelne funkcije u ADT se nikada ne implementiraju jer nikada za taj tip klasa nece biti stvoren ni jedan objekat, s toga ADT sluzi samo kao definicija interfejsa za ostale objekte koji bi se iz nje, eventualno izvodili. Bez obzira na to ipak je moguce obezbediti implementaciju cisto virtuelne funkcije. U tom slucaju ta funkcija (clanica) bi mogla biti pozvana iz instanci koje su izvedene iz ADT.
[ tOwk @ 06.10.2002. 12:02 ] @
Citat:
Časlav Ilić:
Moraću da dam odgovor koji baš ne volim, ali stvarno je tako: pitanje je preširoko da bi se ovde odgovorilo na njega.

Mogu samo da te posavetujem da pročitaš neki duži tekst o tome, sa puno primera kako se koriste u dizajnu programa. Samo kratak opis o tome kako rade nije dovoljan.

Pošto mi je trebalo razjašnjenje terminologije (ili dobra definicija izraza, ili kratak opis upotrebe), poslužilo je i već pomenuto. Kao što rekoh, pitanje je zastarelo, ali sam ga ostavio ako je neko u međuvremenu već odgovorio.

Citat:

Predlažem knjigu "Thinking in C++" od Brusa Ekela, besplatna je u elektronskom obliku i može se naći na www.bruceeckel.com. Ima je u html obliku i kod mene u lokalu: http://home.drenik.net/caslav/ticpp.zip (1706 kB)


Imam dotičnu knjigu već duže vremena, ali nikako i vremena da se pozabavim njom (a programiranjem se bavim u raznim programskim jezicima; ne može se svaki ,,profesionalni izraz'' naučiti :)

U svakom slučaju, zahvaljujem.