Как перегружать и вызвать метод в полученном классе, который был ранее определен в его базовом классе?

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

Вопрос

Это базовый класс:

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));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top