2011-05-29 11 views
7

मैं एक विरासत कोड है:अधिक भार के तरीके सी में भाग जबकि ++

struct Iface1 
{ 
    virtual ~Iface1() {} 
    virtual void foo(const int arg1) const = 0; 
}; 

struct Iface2 
{ 
    virtual ~Iface2() {} 
    virtual void foo(const int arg1, const int arg2) const = 0; 
}; 

/// Composite interface 
struct Iface12 : Iface1, Iface2 
{ 
}; 

मैं समग्र इंटरफेस के लिए एक डेकोरेटर बनाना होगा। निम्नलिखित कोड को भी संकलित नहीं किया गया है क्योंकि यह G ++ और MSVC के लिए "संदिग्ध" है जो कि किस प्रकार का foo() कहा जाता है। क्या कोई मुझे बता सकता है कि नीचे दिए गए कोड को कैसे संकलित और काम करना है? (दुर्भाग्य से मेरे पास रिफैक्टरिंग के लिए कोई समय नहीं है)।

और मुझे यह भी समझ में नहीं आता कि संकलक किस कार्य को कॉल नहीं कर सकता है क्योंकि सभी फ़ंक्शन हस्ताक्षर स्पष्ट हैं। धन्यवाद।

struct IfaceDecorator : Iface12 
{ 
    IfaceDecorator(Iface12& iface) : impl(iface) {} 

    virtual void foo(const int arg1) const 
    { 
    impl.foo(arg1); 
    } 

virtual void foo(const int arg1, const int arg2) const 
{ 
    impl.foo(arg1, arg2); 
} 

private: 
    Iface12& impl; 
}; 
+0

आपको जो सटीक त्रुटि मिल रही है उसे पोस्ट करना चाहिए। –

उत्तर

6

आपको foo को Iface12 कक्षा में स्पष्ट रूप से आयात करने की आवश्यकता है, इसलिए आपको दो अधिभारित फ़ंक्शन Iface12::foo मिलेंगे।

struct Iface12 : Iface1, Iface2 
{ 
    using Iface1::foo; 
    using Iface2::foo; 
}; 

ही नाम के साथ सदस्य कार्य एक दूसरे को ओवरलोड केवल जब वे एक ही कक्षा में घोषित किया गया है, यदि आप एक विरासत समारोह आप using ParentClass::functionName के माध्यम से वर्तमान कक्षा में नाम आयात करने की आवश्यकता को ओवरलोड करना चाहते हैं। मुझे लगता है कि यह कम से कम आश्चर्य का सिद्धांत है - जब तक आप इसके लिए नहीं पूछते हैं तब तक आपके सदस्य फ़ंक्शन को अधिभारित नहीं किया जाएगा।

+0

+1। यह सही तरीका है। – Nawaz

+0

लेकिन क्या एक बयान में 'Iface1' स्कोप से सभी विधियों को आयात करने का कोई तरीका है? कुछ 'iface1 का उपयोग कर;' काम नहीं करता है। – barankin

+0

@barakin, कोई ऐसी विधि नहीं है। – Begemoth

2

समस्या संदेश में है, तो Impl करने के लिए, आप के साथ इसे ठीक कर सकते हैं:

impl.Iface1::foo(arg1); 
// ... 
impl.Iface2::foo(arg1, arg2); 

... और इतने पर।

संपादित किया गया: मैंने इसका परीक्षण किया है और अस्पष्टता खत्म हो गई है।

+0

हाँ, यह काम करता है! मदद के लिए सभी को धन्यवाद! हल किया। – barankin

+1

-1 अलस anwser पर मेरी टिप्पणी देखें। – Begemoth

+0

@ बेगमोथ, मुझे नहीं लगता कि ओपी जो कोड ओपी उदाहरण के रूप में रखा गया है वह सटीक कोड चल रहा है; अन्यथा, उसने यह नहीं कहा होगा कि समस्या हल हो गई है। आपका दावा केवल उदाहरण के रूप में दिए गए सटीक कोड को ध्यान में रखते हुए सच है। – Baltasarq

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