Como sobrecarregar e chamar um método em uma classe derivada que foi definida anteriormente em sua classe base?
-
26-09-2019 - |
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.)
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));
}