2010-06-04 17 views
16

Perché il compilatore C++ restituisce questo errore? Perché posso accedere a lol() da B, ma non posso accedere a rofl() [senza parametri]. Dov'è il trucco?Ereditarietà e sovraccarico di metodi

class A 
{ 
public: 
    void lol(void) {} 
    void rofl(void) { return rofl(0);} 
    virtual void rofl(int x) {} 
}; 

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

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    A a; 
    a.lol(); 
    a.rofl(1); 
    a.rofl(); 

    B b; 
    b.lol(); 
    b.rofl(1);  
    b.rofl(); //ERROR -> B::rofl function does not take 0 arguments 


    return 0; 
} 

risposta

29

I B::rofl(int) 'nasconde' il A::rofl(). Per avere sovraccarichi roflA, è necessario dichiarare B per essere using A::rofl;.

class B : public A { 
public: 
    using A::rofl; 
    ... 
}; 

Questa è una mossa saggia di C++: vi avverte che probabilmente anche necessario eseguire l'override del metodo A::rofl() in B. O lo fai, o dichiari esplicitamente di utilizzare gli altri sovraccarichi dello A.

+0

+1 Più veloce del mio compagno :) – AraK

+0

sì, ma A :: rofl() non è virtuale. Ecco l'idea - rofl() chiama sempre rofl virtuale (0). –

+0

@ 0xDEAD BEEF: in tal caso, si _intend_ per usarlo, quindi rendi chiaro al compilatore dicendo "using A :: rofl;". – xtofl

Problemi correlati