Come sovraccarico e chiamare un metodo in una classe derivata che è stato precedentemente definito nella sua classe di base?
-
26-09-2019 - |
Domanda
Questa è la classe base:
template <class T>
class DataLogger
{
// ...
public:
void AddData(T Data);
// ...
}
E questa è la classe derivata:
#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
}
Il dato di errore è:
LINEA 29: IntelliSense: nessuna funzione di conversione adatto da "std :: coppia" a "lungo doppio" esiste
LINEA 29: IntelliSense: troppo pochi argomenti nella chiamata della funzione
A quanto pare, il problema è che non posso accedere al metodo nella classe base dalla classe derivata, anche se è definito pubblico.
Come faccio a fare questo lavoro codice?
(La mia IDE Visual Studio 2010).
Soluzione
Il tuo AddData
dalla base è nascosto dal AddData
dalla classe derivata. O qualificare esplicitamente la DataLogger<std::pair<long double, long double>>::AddData(...)
chiamata o portarlo a portata di using DataLogger<std::pair<long double, long double>>::AddData;
Altri suggerimenti
Il tuo AddData
di pelli classe derivata della funzione AddData
nella classe base, quindi tutto quello che dovete fare è, unhide quest'ultima direttiva using
utilizzando:
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;
};
Leggi Articolo 33: evitare di nascondere i nomi ereditato Efficace C ++ di Scott Meyers.
Al fine di chiamare il Super metodo di classe ::AddData(x, y);
scrittura. Il nuovo metodo Plotter::AddData
rende DataLogger::AddData
invisibile .
Il problema non è "che non posso accedere al metodo nella classe base dalla classe derivata, anche se essa è definita pubblica".
Il problema è che plotter :: AddData tenta definirsi (con un paio) invece del AddData nella classe base.
E 'possibile effettuare la chiamata esplicita scrivendo
void Plotter::AddData(long double x, long double y)
{
DataLogger<std::pair<long double, long double>>::AddData(std::make_pair(x, y));
}