2013-02-17 3 views
9

Ho bisogno di capire perché C++ non consente di accedere a funzioni sovraccaricate di Grandparent in Child se una delle funzioni sovraccariche è dichiarata in Parent. Si consideri il seguente esempio:Funzione sovraccarico di grandparent in child

class grandparent{ 
public: 
    void foo(); 
    void foo(int); 
    void test(); 
}; 

class parent : public grandparent{ 
public: 
    void foo(); 
}; 

class child : public parent{ 
public: 
    child(){ 
     //foo(1); //not accessible 
     test(); //accessible 
    } 
}; 

funzioni Qui, due funzioni foo() e foo (int) sono sovraccarichi in Nonni. Ma foo (int) non è accessibile poiché foo() è dichiarato in Parent (non importa se è dichiarato pubblico o privato o protetto). Tuttavia, test() è accessibile, il che è corretto secondo OOP.

Ho bisogno di conoscere il motivo di questo comportamento.

risposta

10

Il motivo è metodo nascosto.

Quando si dichiara un metodo con lo stesso nome in una classe derivata, i metodi della classe base con quel nome sono nascosti. La firma completa non ha importanza (cioè qualifiche di cv o elenco di argomenti).

Se si desidera esplicitamente permettere la chiamata, è possibile utilizzare

using grandparent::foo; 

all'interno parent.

+0

C'è un motivo per cui questo comportamento è una buona cosa? (es. ** perché ** come per quale motivo, al contrario di * perché * come in quello che lo causa) –

+1

@SanjayManohar l'unico uso che vedo sarebbe quello di prevenire gli errori - cioè pensare che tu stia chiamando un metodo da genitore e in realtà chiamando un metodo da nonno, perché hai sbagliato a digitare un parametro. E puoi aggirarlo con la direttiva 'using'. –

+0

@SanjayManohar vedi http://stackoverflow.com/questions/4837399/c-rationale-behind-hiding-rule –

1

Provate a immaginare che una biblioteca ha questa classe:

struct Base { 
}; 

Nel codice si utilizza quella classe come classe base:

struct Derived : Base { 
    void f(int); 
}; 

e ora si scrive:

Derived d; 
d.f('a'); 

E ora si ottiene la nuova versione 2.0 lucida di quella libreria, e la classe base è cambiata un po ':

struct Base { 
    void f(char); 
} 

Se il sovraccarico viene applicato qui, il codice si interrompe.