[kami] Skrevet 15. april 2009 Del Skrevet 15. april 2009 class a { public: virtual bool foo(int a) { return true;} protected: virtual bool foo(int a, int b) { return true;} }; class b : public a { public: virtual bool foo(int a, int b) { return true;} }; int main () { b theRealObject; a *shouldWork = &theRealObject; shouldWork->foo(123); theRealObject.foo(123); return 1; } > g++ test.cpp test.cpp: In function `int main()': test.cpp:22: error: no matching function for call to `b::foo(int)' test.cpp:12: note: candidates are: bool b::foo(int, int) Hvorfor funker ikke theRealObject.foo(123) ? burde ikke public arv gi klasse b public access til alle public elementer i klasse a? Lenke til kommentar
zotbar1234 Skrevet 15. april 2009 Del Skrevet 15. april 2009 class a { public: virtual bool foo(int a) { return true;} protected: virtual bool foo(int a, int b) { return true;} }; class b : public a { public: virtual bool foo(int a, int b) { return true;} }; Jeg vet ikke helt, burde man egentlig fraråde å bruke slikt? > g++ test.cpptest.cpp: In function `int main()': test.cpp:22: error: no matching function for call to `b::foo(int)' test.cpp:12: note: candidates are: bool b::foo(int, int) Hvorfor funker ikke theRealObject.foo(123) ? burde ikke public arv gi klasse b public access til alle public elementer i klasse a? Det er tilfellet (man har tilgang til alle variantene av foo fra subklassen), men noen av metodene er skjult. Siden navneoppslag skjer før tilgangssjekk (10.2, §1), får man feilen over. Dette heter "name hiding" på nynorsk: <3.3.7> The declaration of a member in a derived class (clause 10) hides the declaration of a member of a base class of the same name; see 10.2. </slutt> 10.2 forklarer litt mer spesifikt hvordan oppslaget foregår. "Fiksen" på dette er å ikke gjøre den type ting. Den litt mer umiddelbare fiksen er å bruke en using declaration (for bonus points: uten å bruke google eller standarden, hvem husker forskjellen mellom en using directive og en using declaration?), altså: class b : public a{public: using a::foo; virtual bool foo(int a, int b){ return false; }}; Lenke til kommentar
GeirGrusom Skrevet 17. april 2009 Del Skrevet 17. april 2009 a* this_should_work = dynamic_cast<a*>(&the_real_object); Lenke til kommentar
zotbar1234 Skrevet 17. april 2009 Del Skrevet 17. april 2009 a* this_should_work = dynamic_cast<a*>(&the_real_object); Eh, hvordan hjelper det med name hiding? Lenke til kommentar
GeirGrusom Skrevet 17. april 2009 Del Skrevet 17. april 2009 Eh, det gjør ikke det. Lenke til kommentar
zotbar1234 Skrevet 17. april 2009 Del Skrevet 17. april 2009 Eh, det gjør ikke det. Da mistet jeg tråden helt. Hva var poenget med dynamic_cast<>() her? Lenke til kommentar
[kami] Skrevet 27. april 2009 Forfatter Del Skrevet 27. april 2009 Har vel egentlig funnet ut av denne nå, takk for alle svar:) 3.4.1.1 av c++ standarden sier "...name lookup ends as soon as a declaration is found for the name." Regner vel egentlig at dette er en limitation pga multiple inheritance, da funksjonen kan være definert i flere av baseklassene Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå