2011-01-19 9 views
6

मेरे पास बेसक्लास है जिसमें समान नाम के दो कार्य हैं लेकिन 2-स्तर की विरासत में विभिन्न हस्ताक्षर हैं।बेसक्लस फ़ंक्शन नहीं मिल सकता है यदि बेसक्लास के पास समान नाम के दो कार्य हैं

struct A { 
    virtual void f(int) { } 
    virtual void f(int, int) { }; 
    virtual void f1(int) { } 
}; 

struct B: public A { }; 

struct C: public B { 
    void f(int, int) { } 
    void f1(int) { } 
}; 

int main() { 
C obj; 
obj.f1(0); 
obj.f(0,0); 

obj.f(0); // (1) cannot be found 
obj.B::f(0); // (2) works 

} 

मैं (1) पर सही परिभाषा खोजने के लिए मेरी संकलक (जीसीसी-4.3.2) अपेक्षा की होगी, लेकिन मैं दूसरी ओर काम करता है पर

g++  main.cpp -o main 
main.cpp: In function 'int main()': 
main.cpp:20: error: no matching function for call to 'C::f(int)' 
main.cpp:10: note: candidates are: virtual void C::f(int, int) 
distcc[2200] ERROR: compile main.cpp on localhost failed 
make: *** [main] Error 1 

(2) मिलता है।

क्या मैं सामान्य रूप में (1) काम करने के लिए तय करने के लिए की जरूरत है?

+1

+1 पूर्ण उदाहरण के साथ अच्छी तरह से लिखा पद के लिए –

उत्तर

6

लिखें using A::f! void C::f(int, int) छुपा void A::f(int), सिर्फ इसलिए।

3

"क्यों" है इसका संक्षिप्त उत्तर "क्योंकि यह ओवरलोडिंग काम करता है।" आप सी में f(int) ओवरलोड छुपा रहे हैं। लंबा उत्तर बहुत लंबा है।

आप इसे अन-छिपा कर सकते हैं ऐसा करने से: सी

की परिभाषा आप नाम छुपा का शिकार कर रहे हैं अंदर

struct C: public B { 
    using A::f; 
    void f(int, int) { } 
    void f1(int) { } 
}; 
+0

आप हमें लंबे समय तक जवाब देने बता सकते हैं? –

+0

@ होंक: अभी नहीं, मैं समय पर छोटा हूं। लेकिन मैं इसके साथ कुछ मदद दूंगा। –

+2

यह लंबे समय से नहीं है, लेकिन यहां व्याख्या दी गई है: http://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-function-in-c/888337#888337 –

4

सी ++ नाम लुकअप नियमों में यह है कि यदि एक दायरे में एक नाम को फिर से परिभाषित किया गया है, तो सभी उस नाम के ओवरलोड छुपाए गए हैं।

लेकिन आप using प्रयोग करने में मदद कर सकते हैं। इस तरह:

class A { 
    public: 
    int f(int x) { cout << "A::f 1\n"; } 
    int f(int x, int y) { cout << "A::f 2\n"; } 
}; 

class B : public A { 
    public: 
    using A::f; 
    int f(int x) { cout << "B::f 1\n"; } 
}; 

int main() 
{ 
    B b; 

    b.f(27, 34); 

    return 0; 
} 

आउटपुट है:

A::f 2 
संबंधित मुद्दे

 संबंधित मुद्दे