以前にその基底クラスで定義された派生クラスでメソッドをオーバーロードして呼び出す方法?
-
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
}
特定のエラーがあります:
LINE 29:インテリセンス: "長いダブル" への無適した変換機能 "はstd ::ペアは、"
が存在しますLINE 29:インテリセンス:関数呼び出しの引数の数が少なすぎる。
どうやら、問題は、それが公共に定義されていても、私は派生クラスから基底クラスのメソッドにアクセスすることができないということです。
私はこのコードを動作させる方法を教えてください。
(私のIDE 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));
}