Comment surcharge et appeler une méthode dans une classe dérivée qui a été défini précédemment dans sa classe de base?

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

Question

Ceci est la classe de base:

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

Et voici la classe dérivée:

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

L'erreur donnée est la suivante:

  

LINE 29: IntelliSense: aucune fonction de conversion appropriée de "std :: pair" à "long double" existe

     

LIGNE 29: IntelliSense: trop peu d'arguments en appel de fonction

Apparemment, le problème est que je ne peux pas accéder à la méthode dans la classe de base de la classe dérivée, même si elle est définie publique.

Comment puis-je faire ce travail de code?

(Mon IDE est Visual Studio 2010).

Était-ce utile?

La solution

Votre AddData de la base est cachée par la AddData de classe dérivée. Soit qualifier explicitement la DataLogger<std::pair<long double, long double>>::AddData(...) d'appel ou l'amener à portée avec using DataLogger<std::pair<long double, long double>>::AddData;

Autres conseils

Votre AddData en peaux de classe dérivée de la fonction AddData dans la classe de base, donc tout ce que vous devez faire est, unhide cette dernière directive en utilisant 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;

};

Lire Article 33: éviter de masquer les noms hérité efficace C ++ par Scott Meyers.

Pour appeler super méthode de classe ::AddData(x, y); d'écriture. La nouvelle méthode de Plotter::AddData fait DataLogger::AddData invisible .

Le problème n'est pas « que je ne peux pas accéder à la méthode dans la classe de base de la classe dérivée, même si elle est définie publique ».

Le problème est que Traceur :: AddData tente de s'appeler (avec une paire) au lieu de la AddData dans la classe de base.

Vous pouvez faire l'appel explicite en écrivant

void Plotter::AddData(long double x, long double y)
{
    DataLogger<std::pair<long double, long double>>::AddData(std::make_pair(x, y));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top