Wie zu überlasten und ein Verfahren in einer abgeleiteten Klasse aufrufen, die zuvor in ihrer Basisklasse definiert wurde?

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

Frage

Dies ist die Basisklasse:

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

Und das ist die abgeleitete Klasse:

#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
}

Der angegebene Fehler ist:

  

LINE 29: IntelliSense: keine geeignete Konvertierungsfunktion von "std :: pair" auf "long double" existiert

     

LINE 29: IntelliSense: zu wenige Argumente in Funktionsaufruf

Offensichtlich ist das Problem ist, dass ich keinen Zugriff auf die Methode in der Basisklasse von abgeleiteten Klasse, obwohl sie öffentlich definiert ist.

Wie kann ich diesen Code arbeiten?

(Meine IDE ist Visual Studio 2010).

War es hilfreich?

Lösung

Ihre AddData von der Basis wird durch die AddData von abgeleiteten Klasse verborgen. Entweder explizit den Anruf DataLogger<std::pair<long double, long double>>::AddData(...) qualifizieren oder zu Umfang mit using DataLogger<std::pair<long double, long double>>::AddData; bringen

Andere Tipps

Ihre AddData in abgeleiteten Klasse versteckt die Funktion AddData in der Basisklasse, so alles, was Sie tun müssen, ist, sichtbar machen letztere mit using Richtlinie:

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;

};

Lesen Artikel 33: Vermeiden Sie verstecken geerbt Namen Effektive C ++ von Scott Meyers.

Um die Super Klassenmethode Schreib ::AddData(x, y); zu nennen. Die neue Methode macht Plotter::AddData DataLogger::AddData unsichtbar .

Das Problem ist nicht, „dass ich kann keinen Zugriff auf die Methode in der Basisklasse von abgeleiteten Klasse, obwohl sie öffentlich definiert ist“.

Das Problem ist, dass Plotter :: AddData versucht, sich zu nennen (mit einem Paar) anstelle des AddData in der Basisklasse.

Sie können den Anruf explizit durch das Schreiben

void Plotter::AddData(long double x, long double y)
{
    DataLogger<std::pair<long double, long double>>::AddData(std::make_pair(x, y));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top