Como sobrecarregar e chamar um método em uma classe derivada que foi definida anteriormente em sua classe base?

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

Pergunta

Esta é a classe base:

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

E esta é a classe 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
}

O erro dado é:

Linha 29: Intellisense: nenhuma função de conversão adequada de "std :: par" para "long duplo" existe

Linha 29: IntelliSense: poucos argumentos em chamada de função

Aparentemente, o problema é que eu não posso acessar o método na classe base da classe derivada, mesmo que seja definida pública.

Como faço para fazer esse código funcionar?

(Meu IDE é o Visual Studio 2010.)

Foi útil?

Solução

Sua AddData Da base está oculta pelo AddData da classe derivada. Qualifique explicitamente a chamada DataLogger<std::pair<long double, long double>>::AddData(...) ou traga -o para o escopo com using DataLogger<std::pair<long double, long double>>::AddData;

Outras dicas

Sua AddData na classe derivada esconde a função AddData Na classe base, então tudo o que você precisa fazer é, une o último usando using Diretiva:

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;

};

Ler Item 33: Evite ocultar nomes herdados a partir de C ++ eficaz por Scott Meyers.

Para ligar para o super Método de classe Escreva ::AddData(x, y);. O novo Plotter::AddData Método faz DataLogger::AddData invisível.

O problema não é "que eu não posso acessar o método na classe base da classe derivada, mesmo que seja definida pública".

O problema é que a plotter :: addData está tentando se chamar (com um par) em vez do addData na classe base.

Você pode tornar a chamada explícita escrevendo

void Plotter::AddData(long double x, long double y)
{
    DataLogger<std::pair<long double, long double>>::AddData(std::make_pair(x, y));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top