سؤال

ولدي وظيفة مع نفس الاسم، ولكن مع توقيع مختلف في قاعدة والفئات المشتقة منها. عندما أحاول أن استخدام وظيفة الفئة الأساسية في فئة أخرى أن يرث من اشتقاق، أتلقى خطأ. راجع التعليمات البرمجية التالية:

class A
{
    public:
    void foo(string s){};
};

class B : public A
{
    public:
    int foo(int i){};
};

class C : public B
{
    public:
    void bar()
    {
        string s;
        foo(s);
    }
};

وأتلقى الخطأ التالي من المترجم دول مجلس التعاون الخليجي:

In member function `void C::bar()': no matching function for call to `C::foo(std::string&)' candidates are: int B::foo(int)

إذا كنت إزالة int foo(int i){}; من B الطبقة، أو إذا كنت تسميته من foo1، كل شيء يعمل بشكل جيد.

ما هي المشكلة في ذلك؟

هل كانت مفيدة؟

المحلول

وظائف في الفئات المشتقة التي لا تجاوز وظائف في فئات أساسية ولكن التي لها نفس الاسم سوف <م> اخفاء وظائف أخرى تحمل نفس الاسم في الفئة الأساسية.

ويعتبر عموما ممارسة سيئة أن يكون لها وظائف في الفئات المشتقة التي لها نفس الاسم وظائف في فئة باس التي لا تهدف إلى تجاوز وظائف الفئة الأساسية مثل ما كنت ترى ليست عادة السلوك المرغوب فيه. وهي عادة ما تكون أفضل من إعطاء وظائف مختلفة بأسماء مختلفة.

إذا كنت بحاجة إلى استدعاء الدالة قاعدة سوف تحتاج إلى نطاق مكالمة باستخدام A::foo(s). لاحظ أن هذا من شأنه أيضا تعطيل أي آلية وظيفة افتراضية لA::foo(string) في نفس الوقت.

نصائح أخرى

ولأن البحث عن اسم يتوقف إذا وجد اسما في واحدة من القواعد الخاصة بك. انها لن ننظر إلى أبعد في قواعد أخرى. وظيفة في B <م> الظلال وظيفة في A. لديك لإعادة إعلان وظيفة A في نطاق B، بحيث أن كلا من وظائف واضحة من داخل B و C:

class A
{
    public:
    void foo(string s){};
};

class B : public A
{
    public:
    int foo(int i){};
    using A::foo;
};

class C : public B
{
    public:
    void bar()
    {
        string s;
        foo(s);
    }
};

وتحرير: وصف حقيقي يعطي المعيار (من 10.2 / 2):

<اقتباس فقرة>   

والخطوات التالية تحدد نتيجة البحث عن اسم نطاق في الدرجة، C. أولا، كل إعلان ل   اسم في فئة وفي كل الأشياء الفرعية من الدرجة قاعدتها يعتبر. A اسم عضو و في شبه واحد   كائن B و يخفي اسم عضو في فرعي بين وجوه وإذا (أ) هو فرعي كائن الفئة الأساسية من B. أي إعلانات   التي كانت مخبأة حتى يتم التخلص من الاعتبار. كل من هذه الإعلانات التي تم تقديمها من قبل   يعتبر استخدام-إعلان أن يكون من كل كائن فرعي من C الذي هو من نوع يحتوي على declara-   نشوئها المعينة من قبل باستخدام-declaration.96) إذا كانت مجموعة الناتجة من الإعلانات ليست كلها من الأشياء الفرعية   من نفس النوع، أو مجموعة لديها عضوا nonstatic ويشمل أعضاء من أجسام شبه واضحة، هناك   وسوء تشكيلها غموض والبرنامج. إلا أن مجموعة هو نتيجة البحث.

ولديه التالي ليقول في مكان آخر (فقط فوقه):

<اقتباس فقرة>   

لوالتعبير عن الهوية [<م> شيء من هذا القبيل "فو" ]، ويبدأ البحث عن اسم في نطاق فئة من هذا. لمؤهل معرف [<م> شيء من هذا القبيل "A :: فو"، A هو متداخلة اسم-محدد ]، ويبدأ البحث عن اسم في نطاق متداخلة اسم-محدد. البحث عن اسم يحدث قبل التحكم بالوصول (3.4، الفقرة 11).

و([...] التي طرحها لي). لاحظ أنه يعني أنه حتى لو فو بك في B هو خاص، وسوف لا يزال لم يتم العثور على فو في A (لمراقبة الدخول يحدث لاحقا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top