Inkluzivni polimorfizam i virtuelne funkcije

2

Inkluzivni polimorfizam i virtuelne funkcije

offline
  • Pridružio: 17 Mar 2004
  • Poruke: 293
  • Gde živiš: UK

Ne, virtual inheritance nema nikakve veze sa virtuelnim funkcijama u tom obliku. Virtual Inheritance sluzhi samo da obezbedi jednu jedinu instancu bazne klase kod vishestrukog nasledjivanja.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 19 Maj 2005
  • Poruke: 352
  • Gde živiš: Sabac - Novi Sad

OK, skontao sam... Hvala!

Dopuna: 29 Jan 2006 20:45

@bNasty

Eee, izvini opet ja, jos samo ovo....

Citat:Kompajler za svaku klasu u hijerarhiji koja sadrzhi virtuelne funkcije (ukljuchujuci i destruktor) pravi "virtuelnu tabelu funkcija".
Kada se kreira instanca ovakve klase kompajler 'iza ledja' u sam objekar ugradjuje pointer na pomenutu tabelu virtuelnih funkcija

Da li se u objektu nalaze adrese svih virtualnih tabela? Ako ne kako on zna koja je tabela klase nize po hijerarhiji?

Znaci ako u izvedenoj klasi nema virtuelne funkcije, a mi za njen objekat pozovemo v. funkciju, compajler skonta da te f-je nema u toj tabeli, kako onda da zna koja je adresa nize tabele...?

P.S. Izvini sto te smaram sa ovim pitanjima, ali kontam ako sam se vec zaleteo bar da skontam do kraja...



offline
  • Pridružio: 17 Mar 2004
  • Poruke: 293
  • Gde živiš: UK

Citat:Da li se u objektu nalaze adrese svih virtualnih tabela? Ako ne kako on zna koja je tabela klase nize po hijerarhiji?

Onaj predjashnji opis je bio malo vishe 'literaran' nego praktichan, tj. kompajleri to malo drugachije trpaju u memoriju, sve zarad optimizacije (jer poziv virtuelne funkcije je uvek dosta skuplji nego poziv ne-virtuelne funkcije, i kompajleri obezbedjuju razne cake kako bi cenu virtuelnog poziva sveli na minimum)

Virtuelna tabela (koja sadrzhi u sebi pointere na virtuelne funkcije) se pravi SAMO JEDNOM za celu klasu, i svi objekti te klase dele tu jednu tabelu. Samo pointer na tu tabelu se ugradjuje u sam objekat (kod Microsoft kompajlera je __vfptr prvi chlan klase, tj. na ofsetu nula).

Kompajler u principu i ne mora da zna koja klasa je "nizha u hijerarhiji", jer se virtuelne tabele UVEK prave za vreme kompajliranja, i za svaku klasu kompajler vec zna gde se nalazi odgovarajuca tabela virtuelnih funkcija. Poshto se funkcije ne "dupliraju" (tj. postoji samo jedan entry-point za odgovarajucu funkciju) kompajler ce za izvedenu klasu da napravi tabelu sa svim virtuelnim funkcijama, pochev od prve bazne klase pa do klase koju trenutno kompajlira.

Recimo da imash sluchaj

class B : public A {};

Virtuelna tabela za klasu A ce sadrzhati pointere na sve virtuelne funkcije u klasi A. Tabela za klasu B ce sadrzhati (naravno) pointere na sve v. funkcije klase B, ALI ako B ne inplementira virtuelnu funkciju koja je definisana u klasi A onda ce na tom mestu u tabeli biti pointer na tu funkciju iz klase A! Ovim se postizhe da kompajler ne mora da trazhi razne tabele u run-time, vec su sve funkcije vec spakovane u tabele za najbrzhi moguci pristup.
Izuzetak je sledeci sluchaj : recimo da klasa B implementira v. funkciju iz klase A, ali takodje poziva i tu istu funkciju u klasi A, neshto ovako :

void B::fn()
{
/* neki kod */

A::fn();
}

U tom sluchaju ce kompajler da generishe kod koji ce da se obrati virtuelnoj tabeli za klasu A i da dobije pointer na funkciju "fn" odatle, iako je "fn" u klasi B deklarisana u tabeli za klasu B. Kompajler mozhe ovo da uradi zato shto je klasa A eksplicitno pozvana u kodu preko A::fn().


Huh... zvuchi komplikovano, jer i jeste komplikovano. Ustvari, sve dovde je josh i jednostavno, komplikacije krecu kada se pojavi vishestruko virtuelno nasledjivanje, i doda josh i "vbptr" pointer, ali to je vec "outside the scope of this article" Smile

U principu, ovako radi vecina kompajlera, vec sam pomenuo da je proizvodjachima kompajlera dozvoljeno da implementiraju ove mehanizme kako oni god misle da je najbolje za odredjenu platofrmu.

Umesto gomile ovog teksta, ovde imash to mnogo krace (i bolje) objashnjeno, sa par slichica :

http://www.icce.rug.nl/documents/cplusplus/cplusplus14.html#l209


EDIT :

Da ne ispadne da tvrdim kako je ovo apsolutno tachan opis nachina kako kompajler pakuje v-tables - mislim da je MS kompajler (od verzije 6, mozhda i greshim) pravio jednu tabelu za celu hijerarhiju klasa i koristio ofsete unutar te jedne tabele da bi doshao do odeljka za odgovarajucu klasu. Moguce je da su ovo uradili kao optimizaciju kako bi bili cache-friendly i imali shto manje skakanja po memoriji. Nisam struchnjak za kompajlere, pa ne mogu bash da tvrdim da je to sluchaj Smile

offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

A ja upravo spremam ispit za sutra zvani "Konstrukcija kompajlera" i ne znam ni trecinu od toga sto si rekao. Dobro je da nisi strucnjak. Sta bi nam tek onda napricao? Smile

offline
  • Pridružio: 17 Mar 2004
  • Poruke: 293
  • Gde živiš: UK

I? Kako prodje na tom ispitu? :-)

offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Upravo sam dobio 9. Sve sam joj rekao i ona opet "klimava devetka". Kao "slabi su ti kolokvijumi". A inace su kolokvijumi zamena za usmeni sa koga sam upravo dosao. Pa zato sam i izasao sto su mi slabi kolokvijumi. Ne razumem neke ljude, pa to ti je. Asistent je poceo da vrda kad sam ga pitao da li sam za desetku, ali jedan "ozbiljno-mrki" pogled je bio dovoljan da mi kaze "pa sve si znao". A da ne pricam sto mi se skoro smejala sto sam tek u 4. godini odlucio da popravim prosek da bih upisao magistarski, jer nam je bas dobro spusten kriterijum. Kao "sa 7.20 bi ti magistarski?!!?!?". Da bi mi posle par minuta asistent ponudio posao (mozda cak i prvom od svih studenata). Toliko o nasem skolstvu, izvinjavam se za offtopic, ali mi je bNasty ... hm ... ne mogu reci stao na zulj, ali bas me je pitao nesto zbog cega sam trenutno jako nadrkan. Slobodno obrisite ovaj post za par dana ili mi recite da ga sam brisem, ali mi dopustite malo pare na usi da pustim pre nego sto se to desi. Hvala i pisemo se. Smile

offline
  • Pridružio: 19 Maj 2005
  • Poruke: 352
  • Gde živiš: Sabac - Novi Sad

Eh, kad se setim Smile Davno je ovo pisano!
Imam par pitanja, prilicno vezanih za ovo pa bi voleo da prodiskutujemo Smile
Situacija:

class Base{    void metoda() {cout<<"Base"<<endl;} }

class A : public virtual Base{    float metoda() {cout<<"A"<<endl;} }


class B : public virtual Base{    int metoda() {cout<<"B"<<endl;} }


class C : public A : public B{ }


  C *c = new C();   c->metoda();        //<= error - ne zna koju metodu da pozove

Znam da se problem moze resiti ako napisem ovako:

class C : public A : public B{   using A::metoda; }

To resava problem i poziva metodu A klase. Jel moze drugacije da se razresi ova situacija?

Ko je trenutno na forumu
 

Ukupno su 1183 korisnika na forumu :: 43 registrovanih, 7 sakrivenih i 1133 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., Bobrock1, Botovac, Brana01, CikaKURE, dankisha, dijica, Dimitrije Paunovic, dragoljub11987, dushan, Georgius, herrDule, ILGromovnik, Kubovac, kuntalo, Leonov, lord sir giga, Lošmi, Magistar78, Mcdado, mercedesamg, milenko crazy north, milutin134, mrvica78, nebkv, oldtimer, panonski mornar, Parker, raptorsi, royst33, srbijaiznadsvega, Srle993, ss10, stegonosa, Stoilkovic, Sumadija34, suton, tmanda323, vasa.93, vladulns, voja64, Volkhov-M, Zandar