2016-10-04 58 views
9

structs की निम्न पदानुक्रम पर विचार करें:अतिभारित छुपा आभासी समारोह

struct I1 { 
    virtual void doit() = 0; 
}; 

struct I2 { 
    virtual void doit(int) = 0; 
}; 

struct I12 : I1, I2 { 
    using I1::doit; 
    using I2::doit; 
}; 

struct Derived : I12 { 
    void doit(int) override {} 
}; 

इस संकलन (clang, या g++-Woverloaded-virtual साथ उपयोग करते हुए) मुझे एक चेतावनी देता है: अगर मैं I12 बदलने

'Derived::doit' hides overloaded virtual function [-Woverloaded-virtual] 

हालांकि, निम्नलिखित में, यह clang के तहत ठीक से संकलित करता है, जबकि g++ -Woverloaded-virtual अभी भी एक चेतावनी देता है:

struct I12 : I1, I2 { 
    using I1::doit; 
    void doit(int) override = 0; 
}; 

using I2::doit और void doit(int) override = 0 के बीच अंतर कहां है? नैतिक रूप से, मैंने सोचा होगा कि पूर्व संकलक को सूचित करने के लिए पर्याप्त है कि मुझे पता है कि doit के दो संस्करण हैं।

+0

आप क्या संकलक का उपयोग कर रहे हैं? मुझे जीसीसी या एमएसवीएस में चेतावनी नहीं मिल सकती है लेकिन मैं झुकाव में करता हूं। – NathanOliver

+0

हां आप इसे छुपा रहे हैं। तो आपका सवाल क्या है? वर्बोज चेतावनी को कैसे खत्म करें? – songyuanyao

+0

@NathanOliver मैंने क्लैंग का उपयोग किया, लेकिन चेतावनियों के साथ जी ++ का उपयोग विभिन्न व्यवहार दिखाता है। – phimuemue

उत्तर

1

यह शिकायत करता है कि doitDerived में छिपा हुआ है। फिक्स:

struct Derived : I12 { 
    using I12::doit; // Bring all doit declarations from I12 into this scope. 
    void doit(int) override {} 
}; 
+0

आपके शर्करा के लिए धन्यवाद, लेकिन मेरे ठोस मामले में, मेरे पास 'व्युत्पन्न 1',' व्युत्पन्न 2', ..., और संभवतः 'doit1',' doit2' ... है, इसलिए मैं वास्तव में उन सभी को दोहराना नहीं चाहता 'हर जगह 'declaratiati का उपयोग कर, लेकिन यदि संभव हो तो केवल एक केंद्रीय जगह पर। – phimuemue

+0

@phimuemue इस तरह के डिज़ाइन के साथ चेतावनी को बंद करना आसान हो सकता है। '-Wno-अतिभारित-virtual'। अन्यथा आपको जगह पर 'उपयोग' छिड़काव करना होगा क्योंकि इस प्रकार छिपाने का नाम सी ++ में काम करता है। –

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