2010-06-04 10 views
16

¿Por qué el compilador de C++ da este error? Por qué puedo acceder a lol() desde B, pero no puedo acceder a rofl() [sin parámetros]. ¿Dónde está la captura?Sobrecarga de herencia y método

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; 
} 

Respuesta

29

Los B::rofl(int) 'esconde' la A::rofl(). Para tener A 's rofl sobrecargas, debe declarar B ser using A::rofl;.

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

Este es un acierto de C++: se le advierte que es probable que también necesita reemplazar el método A::rofl() en B. O haces eso o declaras explícitamente que utilizas otras sobrecargas de A.

+0

+1 Más rápido que mi compañero :) – AraK

+0

sí, pero A :: rofl() no es virtual. Esa es la idea: rofl() siempre llama virtual rofl (0). –

+0

@ 0xDEAD BEEF: en ese caso, usted _intend_ para usarlo, así que deje en claro al compilador diciendo 'using A :: rofl;'. – xtofl

Cuestiones relacionadas