كيفية زيادة التحميل والاتصال بالطريقة في فئة مشتقة تم تعريفها مسبقًا في فئة القاعدة؟

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

سؤال

هذه هي الفئة الأساسية:

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));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top