Как перегружать и вызвать метод в полученном классе, который был ранее определен в его базовом классе?
-
26-09-2019 - |
Вопрос
Это базовый класс:
template <class T>
class DataLogger
{
// ...
public:
void AddData(T Data);
// ...
}
И это полученный класс:
#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
}
Данная ошибка:
Строка 29: IntelliSense: нет подходящих функций преобразования из «STD :: Pair» на «Длинный двойной»
Строка 29: Intellisense: Слишком мало аргументов в вызове функций
По-видимому, проблема в том, что я не могу получить доступ к способу в базовом классе от производного класса, даже если он определяется публично.
Как мне сделать этот код?
(Мой IDE - Visual Studio 2010.)
Решение
Твой AddData
от базы скрывается AddData
от производного класса. Либо явно квалифицировать вызов DataLogger<std::pair<long double, long double>>::AddData(...)
или принести его на сферу using DataLogger<std::pair<long double, long double>>::AddData;
Другие советы
Твой AddData
в полученном классе скрывает функцию AddData
в базовом классе, так что все, что вам нужно сделать, то, что показать последнее, используя 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;
};
Читать Пункт 33: Избегайте скрытия унаследованных имен от Эффективный C ++ Скотт Мейерс.
Чтобы позвонить супер Класс метод записи ::AddData(x, y);
. Отказ Новый Plotter::AddData
метод составляет DataLogger::AddData
невидимый.
Проблема не в том, что я не могу получить доступ к способу в базовом классе от производного класса, даже если он определяется публичным ».
Проблема в том, что плоттер :: adddata пытается позвонить себе (с парой) вместо adddata в базовом классе.
Вы можете сделать звонок явным, написав
void Plotter::AddData(long double x, long double y)
{
DataLogger<std::pair<long double, long double>>::AddData(std::make_pair(x, y));
}