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

Zašto ovo neće da se kompajlira

[es] :: C/C++ programiranje :: C/C++ za početnike :: Zašto ovo neće da se kompajlira

[ Pregleda: 2737 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

eva01

Član broj: 49540
Poruke: 120
*.ptt.yu.

Jabber: eva01@jabber.3gnt.org


Profil

icon Zašto ovo neće da se kompajlira28.09.2006. u 23:23 - pre 213 meseci
Kod je ispod. do_nothing(int) je definisan u A, nju nasledi B koji dodaje svoj do_nothing(Joe &) na kraju C nasledi B. Problem je što kompajler nije u stanju da provali da A ima do_nothing(int)... Stvarno ne kapiram zašto. Sve se ponaša kao da je do_nothing(int) zaklonjeno sa do_nothing(Joe &) ali očigledo je da imaju različite parametre...


Code:

class Joe {
};

class A {
public:
virtual void do_nothing(int x){};
};

class B : public A {
public:
    void do_nothing(Joe &x)  {};
};

class C : public B {
public:
    void do_nothing(int x)  {};
};
    

using namespace std;

int main(int argc, char *argv[]) 
{
    Joe i_am_joe;
    C i_am_c;
    i_am_c.do_nothing(i_am_joe);
    cout << "Hello, from Win32!" << endl;

    return EXIT_SUCCESS;
}
 
Odgovor na temu

pcaca
Aleksandar
Makedonija

Član broj: 5333
Poruke: 92
62.162.197.*



Profil

icon Re: Zašto ovo neće da se kompajlira29.09.2006. u 00:38 - pre 213 meseci
Naravno da nece da se kompajlira kad funkcija do_nothing u C klasu ocekuje int (preklopljena ti je funkcija kako sto si i sam reako). Isto tako polimorfizam radi sa pozivima preko reference ili pointer ako pokusavas da uradis polimorfni poziv virutelne funkcije. Neznam sta tacno zelis da uradis mozda nesto ovako.
Code:

class Joe {
};

class A {
public:
    virtual void do_nothing(Joe &x){};
};

class B : public A {
public:
    void do_nothing(Joe &x)  {};
};

class C : public B {
public:
    void do_nothing(Joe &x)  {};
};
    

using namespace std;

int main(int argc, char *argv[]) 
{
    Joe i_am_joe;
    A *i_am_c = new C;
    i_am_c->do_nothing(i_am_joe);
    cout << "Hello, from Win32!" << endl;

    return 0;
}
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Zašto ovo neće da se kompajlira29.09.2006. u 00:41 - pre 213 meseci
Naleteo si na "name hiding" osobinu C++a.

Metoda u izvedenoj klasi ce "sakriti" sve metode istog imena iz bazne klase, bez obzira na "potpis" metoda, tj. bitno je samo da je ime metode isto.
 
Odgovor na temu

android~paranoid

Član broj: 81947
Poruke: 211
*.041net.co.yu.



Profil

icon Re: Zašto ovo neće da se kompajlira29.09.2006. u 09:05 - pre 213 meseci
Citat:
Code:
class C : public B {
public:
    void do_nothing(Joe &x)  {};
};


C nasledjuje iz B tako da moze da se pozove i originalna f-ja iz B
a nemora preklopljena, znaci mora se razresiti

Code:
B::i_am_c->do_nothing(i_am_joe);

Mislim, šta reći !
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

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



+6 Profil

icon Re: Zašto ovo neće da se kompajlira29.09.2006. u 15:09 - pre 213 meseci
Citat:
eva01: Stvarno ne kapiram zašto. Sve se ponaša kao da je do_nothing(int) zaklonjeno sa do_nothing(Joe &) ali očigledo je da imaju različite parametre...


Kao što reče NastyBoy, http://www.research.att.com/~bs/bs_faq2.html#overloadderived
 
Odgovor na temu

eva01

Član broj: 49540
Poruke: 120
*.ptt.yu.

Jabber: eva01@jabber.3gnt.org


Profil

icon Re: Zašto ovo neće da se kompajlira29.09.2006. u 21:18 - pre 213 meseci
Hvala na pomoći, rešio sam baš kao što je gore sugerisano. Ipak nikako ne mogu da shvatim logiku koja stoji iza ovoga. Možda neko ima ideju?
 
Odgovor na temu

android~paranoid

Član broj: 81947
Poruke: 211
*.041net.co.yu.



Profil

icon Re: Zašto ovo neće da se kompajlira29.09.2006. u 22:46 - pre 213 meseci
Meni je ovo bas logicno da se izvrsi f-ja iz klase naslednika jer se primenjuje na instancu te klase, a da za nasledjenu f-ju napises razresenje (::).
Mislim, šta reći !
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.hsd1.ma.comcast.net.



+6 Profil

icon Re: Zašto ovo neće da se kompajlira29.09.2006. u 23:07 - pre 213 meseci
Citat sa gornjeg linka:

Citat:
In C++, there is no overloading across scopes - derived class scopes are not an exception to this general rule.

 
Odgovor na temu

eva01

Član broj: 49540
Poruke: 120
*.ptt.yu.

Jabber: eva01@jabber.3gnt.org


Profil

icon Re: Zašto ovo neće da se kompajlira29.09.2006. u 23:58 - pre 213 meseci
Hvala Dragi Tata, ukapirao sam u čemu je problem. Ustvari hteo sam da pitam šta se time dobija? Nekako mi je bilo logično: ako funkcije imaju isto ime a različitu listu parametara onda su to različite funkcije. Sad ispada da imaju i neke dodatne osobine, što mi iz tog ugla deluje samo kao nepotrebno komplikovanje.

[Ovu poruku je menjao eva01 dana 30.09.2006. u 01:12 GMT+1]
 
Odgovor na temu

android~paranoid

Član broj: 81947
Poruke: 211
*.041net.co.yu.



Profil

icon Re: Zašto ovo neće da se kompajlira30.09.2006. u 17:31 - pre 213 meseci
Citat:
eva01:  ako funkcije imaju isto ime a različitu listu parametara onda su to različite funkcije.


I jesu razlicite, da su u istoj klasi one bi bile razlicite ako imaju razlicite parametre, ali ne i tip koji vracaju, to se ne uzima u obzir.
Mislim, šta reći !
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.hsd1.ma.comcast.net.



+6 Profil

icon Re: Zašto ovo neće da se kompajlira30.09.2006. u 20:28 - pre 213 meseci
Citat:
eva01: Ustvari hteo sam da pitam šta se time dobija?


Ništa se ne "dobija". Jednostavno, overloading radi samo za funkcije u istom opsegu: npr možeš da imaš overloadovane funkcije u istom namespace-u, ali se pravila overloadinga ne primenjuju kad su funkcije u dva različita namespace-a. Isto to pravilo važi i za klase: pogledamo ime i ako ga nađemo to je to, ne idemo u roditeljsku klasu da tražimo potencijalno overloadovane funkcije.


 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Zašto ovo neće da se kompajlira

[ Pregleda: 2737 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

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