Cómo sobrecarga y llamar a un método en una clase derivada que se definió previamente en su clase base?

StackOverflow https://stackoverflow.com/questions/4616462

Pregunta

Esta es la clase base:

template <class T>
class DataLogger
{
        // ...
    public:
        void AddData(T Data);
        // ...
}

Y esta es la clase derivada:

#include "DataLogger.h"
#include <utility>

class Plotter : public DataLogger<std::pair<long double, long double>>
{
        // ...
    public:
        void AddData(long double x, long double y);
        // ...
}

// This method is supposed to wrap the original AddData() method
// which was defined in the base class
void Plotter::AddData(long double x, long double y)
{
    AddData(std::make_pair(x, y));  // LINE #29
}

El error dado es:

  

LINEA 29: IntelliSense: ninguna función de conversión adecuado de "std :: pair" a "de largo doble" existe

     

LINEA 29: IntelliSense: muy pocos argumentos en función de llamada

Al parecer, el problema es que no puede tener acceso al método en la clase base desde la clase derivada, a pesar de que se define público.

¿Cómo puedo hacer este trabajo código?

(Mi IDE es Visual Studio 2010).

¿Fue útil?

Solución

Su AddData de la base está oculta por el AddData de la clase derivada. De cualquier calificar explícitamente la DataLogger<std::pair<long double, long double>>::AddData(...) llamada o llevarlo a alcance con using DataLogger<std::pair<long double, long double>>::AddData;

Otros consejos

Su AddData en cueros clase derivada de la función AddData en la clase base, por lo que todo lo que necesita hacer es, mostrar la última directiva using using:

class Plotter : public DataLogger<std::pair<long double, long double>>
{

public:
   //unhiding : bringing base class function into scope!
   using DataLogger<std::pair<long double, long double>>::AddData;

};

Leer Artículo 33: Evitar la ocultación de nombres heredó eficaz C ++ por Scott Meyers.

Con el fin de llamar a la Super método de clase ::AddData(x, y); escritura. El nuevo método Plotter::AddData hace DataLogger::AddData invisible .

El problema no es "que no puede tener acceso al método en la clase base desde la clase derivada, a pesar de que se define pública".

El problema es que Plotter :: AddData está tratando de llamar a sí mismo (con un par) en lugar del AddData en la clase base.

Se puede realizar la llamada explícita escribiendo

void Plotter::AddData(long double x, long double y)
{
    DataLogger<std::pair<long double, long double>>::AddData(std::make_pair(x, y));
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top