2009-01-22 5 views
10

निम्न कोड चेतावनी C4250 उत्पन्न करता है। मेरा सवाल है, इसका सबसे अच्छा समाधान क्या है?विजुअल स्टूडियो कंपाइलर चेतावनी C4250 ('class1': विरासत के वर्ग 2 :: सदस्य 'प्रभुत्व के माध्यम से)

class A 
{ 
    virtual void func1(); 
} 

class B : public A 
{ 
} 

class C : public A 
{ 
    virtual void func1(); 
} 

class D : public B, public C 
{ 
} 

int main() 
{ 
    D d; 
    d.func1(); // Causes warning 
} 

मैं क्या यह ऐसा करने के लिए संभव हो जाना चाहिए पढ़ा है के अनुसार:

class D : public B, public C 
{ 
    using B::func1(); 
} 

लेकिन, यह वास्तव में कुछ भी नहीं है। जिस तरह से मैं वर्तमान में इसका समाधान कर लिया है:

class D : public B, public C 
{ 
    virtual void func1() { B::func1(); } 
} 

क्या इस पर हर किसी का नजरिया है?

+0

पहले ब्लॉक में कोड संकलित नहीं करता है और इसे संकलित करने के बाद इसे बदलने के बाद यह C4250 उत्पन्न नहीं करता है। – quamrana

उत्तर

7

क्या आपने कक्षा ए से सार्वजनिक आभासी उत्तराधिकारी का प्रयास करने का प्रयास किया था? मुझे लगता है कि इसे हल करना चाहिए।


    class B :public virtual A; 
    class C :public virtual A; 
    class D : public virtual B, public virtual C; 

आभासी विरासत अस्पष्टता को हल करने लगता है।

+1

हां, यहां तक ​​कि वर्चुअल विरासत के साथ भी यह एक ही समस्या है (कॉल करने के लिए दो उपयुक्त फ़ंक्शंस हैं, कंपाइलर बस सबसे अधिक "ओवरराइड" चुनता है) –

+0

तब मुझे लगता है कि आपके सुझाए गए समाधान से कोई बच नहीं है। –

+3

मैंने आपके कोड को अब VS2005 में संकलित किया है और वर्चुअल के बिना यह वास्तव में एक त्रुटि है, चेतावनी नहीं। आभासी के साथ यह एक चेतावनी है। –

0

मुझे लगता है कि आप जिस समाधान का उपयोग कर रहे हैं वह जाने का तरीका हो सकता है, कहने के लिए खेद है। केवल एक चीज जिसे मैं सोच सकता हूं, मदद कर सकता है अगर आप ए के func1 शुद्ध आभासी बनाने में सक्षम हैं। हालांकि, आपके असली कार्यक्रम में यह संभव नहीं हो सकता है।

+1

दुर्भाग्यवश दृश्य स्टूडियो में एक बग है जिसका अर्थ है कि चेतावनी अभी भी दिखाई देगी;) –

18

मैं निम्नलिखित कोड के लिए एक ही चेतावनी थी: विज़ुअल सी के लिए

class Interface 
{ 
public: 
    virtual void A() = 0; 
}; 

class Implementation : public virtual Interface 
{ 
public: 
    virtual void A() {}; 
}; 

class ExtendedInterface : public virtual Interface 
{ 
    virtual void B() = 0; 
}; 

class ExtendedImplementation : public ExtendedInterface , public Implementation 
{ 
public: 
    virtual void B() {}; 
}; 

यह bug report ++ MSDN में 2005 चलता है कि यह एक ज्ञात बग है कि ठीक करने के लिए ... वे करने के लिए सुझाव काफी महत्वपूर्ण नहीं माना जाता था है एक प्रज्ञा का उपयोग करके इस मामले में चेतावनी को अक्षम करें। मुझे लगता है कि यह आपके मामले में भी सुरक्षित है, लेकिन आपको गैल गोल्डमैन द्वारा उत्तर में दिखाए गए वर्चुअल विरासत का उपयोग करना चाहिए।

0

आसान हल

class A 
{ 
    virtual void func1(); 
} 

class B : public A 
{ 
} 

class C : public A 
{ 
    virtual void func1(); 
} 

class D : public B, public C 
{ 
    virtual void func1() 
    { 
    C::func1(); 
    } 
} 

int main() 
{ 
    D d; 
    d.func1(); // Causes warning 
} 
1

[एक टिप्पणी वास्तव में, लेकिन मैं पर्याप्त प्रतिनिधि नहीं है ...]

डेविड Segonds वी.एस. 2005 में एक ज्ञात बग के रूप में इस पहचान, बस अपने उदाहरण की कोशिश की वीएस 2008 में कोड और यह एक ही समस्या प्रदर्शित करता है।

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