كيفية زيادة التحميل والاتصال بالطريقة في فئة مشتقة تم تعريفها مسبقًا في فئة القاعدة؟
-
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
}
الخطأ المعطى هو:
السطر 29: Intellisense: لا توجد وظيفة تحويل مناسبة من "STD :: Pair" إلى "Long Double" موجودة
السطر 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));
}