2011-03-05 25 views

Respuesta

16

Esta declaración unhides un miembro de clase base. Esto se usa con mayor frecuencia para permitir sobrecargas de una función miembro. Ejemplo:

class Base { 
public: 
    void method() const; 
}; 

class Derived : public Base { 
public: 
    void method(int n) const; 
    // Without the using, you would get compile errors on d.method(); 
    using Base::method; 
}; 
5

El caso lo he visto:

class A 
{ 
    void foo(int); 
    void foo(float); 
} 

class B : public A 
{ 
    void foo(string); 
} 

B b; 
b.foo(12); // won't work! 

Debido a que he implementado una nueva función foo en B con una firma diferente que oculta las funciones foo de A. Con el fin de anular este comportamiento lo haría:

class B : public A 
    { 
     void foo(string); 
     using A::foo; 
    } 
4

mayoría de las veces, la sintaxis como esta se utiliza de esta manera:

class derived : public base { 
public: 
    [...] 
    using base::method; 
}; 

La declaración using aquí muestra una declaración de miembro de la clase principal. Esto a veces es necesario si la declaración de otro miembro en derived puede ocultar el miembro de base.

0

Si anotherClass es una clase base que contiene una función miembro como

virtual void f(); 

y decide sobrecargar la función en la clase derivada como

virtual void f(int); 

que "oculta" f() en la clase base. Llamar f() a través de un puntero a la clase derivada, por ejemplo, daría como resultado un error, ya que el compilador no "ve" la versión de f() sin tomar más argumentos de la clase base.

Al escribir

using Base::f; 

puede traer las clases base funcionan de nuevo en su alcance, lo que permite la resolución de sobrecarga como se podría haber esperado que trabajar en primer lugar.

Cuestiones relacionadas