Come sovraccarico e chiamare un metodo in una classe derivata che è stato precedentemente definito nella sua classe di base?

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

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).

È stato utile?

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));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top