[ eva01 @ 28.09.2006. 23:23 ] @
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;
}
[ pcaca @ 29.09.2006. 00:38 ] @
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;
}
[ NastyBoy @ 29.09.2006. 00:41 ] @
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.
[ android~paranoid @ 29.09.2006. 09:05 ] @
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);
[ Dragi Tata @ 29.09.2006. 15:09 ] @
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
[ eva01 @ 29.09.2006. 21:18 ] @
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?
[ android~paranoid @ 29.09.2006. 22:46 ] @
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 (::).
[ Dragi Tata @ 29.09.2006. 23:07 ] @
Citat sa gornjeg linka:

Citat:
In C++, there is no overloading across scopes - derived class scopes are not an exception to this general rule.
[ eva01 @ 29.09.2006. 23:58 ] @
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]
[ android~paranoid @ 30.09.2006. 17:31 ] @
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.
[ Dragi Tata @ 30.09.2006. 20:28 ] @
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.