Gå til innhold

arv fra baseklasse og synlighet av funksjoner


Anbefalte innlegg

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
Videoannonse
Annonse

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.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?

 

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
  • 2 uker senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...