2011-08-10 18 views
5

Teniendo en cuenta este código:¿Cómo exponer la sobrecarga oculta de la clase base?

class base { 
public: 
    string foo() const; // Want this to be visible in 'derived' class. 
} 

class derived : public base { 
public: 
    virtual int foo(int) const; // Causes base class foo() to be hidden. 
} 

¿Cómo puedo hacer la base :: foo() visible para derivados sin replicar con una sobrecarga de métodos ficticia que llama a la clase base? ¿Funciona el using? Si es así, ¿a dónde va, es así?

class derived : public base { 
public: 
    virtual int foo(int) const; 
    using base::foo; 
} 

Respuesta

4

Disculpe la respuesta, pero sí. Es exactamente así, y hace lo que quiere:

class derived : public base { 
public: 
    virtual int foo(int) const; 
    using base::foo; 
}; 

También tenga en cuenta que se puede acceder a la base, incluso sin using:

métodos
derived x; 
string str = x.base::foo(); // works without using 
+0

Supongo que esto también funciona para los punteros: x_ptr-> base :: foo(), ¿verdad? – WilliamKF

+0

@William: sip. La diferencia entre los dos es que 'using' extrae todos los miembros de ese nombre a un único alcance, por lo que todos participan en la resolución de sobrecarga. – ybungalobill

1

El uso de Directiva hará seleccionados de la base visible para el alcance de derivado. Pero desde un punto de vista de diseño esto no es deseable, ya que está ocultando nombres al alcance de los derivados mientras usa una interfaz pública. (Hacer esto con una interfaz privada tiene más sentido)

Cuestiones relacionadas