2010-02-09 14 views
6

मान लीजिए मैं एक हीरे की विरासत स्थिति इस प्रकार है:निम्न वर्ग में वर्चुअल टेबल क्यों है?

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

अंतिम पंक्ति अस्पष्टता का हवाला देते हुए एक संकलन त्रुटि अर्जित करता है। जैसा कि मैं इसे समझता हूं, समस्या यह है कि संकलक को पता नहीं है कि डी के vtbl में कौन सा foo रखना है, लेकिन डी के लिए एक vtbl क्यों होगा यदि यह किसी भी वर्चुअल फ़ंक्शन को परिभाषित नहीं करता है?

+0

क्या "वर्चुअल" सुरक्षा स्तर विनिर्देशक है जो आपकी कक्षा घोषणा लाइनों (जैसे कक्षा बी: वर्चुअल ए) पर भी मान्य है? – Joe

+4

यह कोई सुरक्षा विनिर्देशक नहीं है। यह वर्चुअल बेस क्लास को दर्शाता है, जो कि हीरा की समस्या के आसपास काम करने के लिए एक कानूनी हैक है। –

+0

आह, ठीक है, धन्यवाद। – Joe

उत्तर

7

आप वर्चुअल फ़ंक्शंस वाले कक्षाएं प्राप्त कर रहे हैं। इसलिए, आपकी कक्षा में आभासी कार्य हैं। यह इतना सरल है।

+0

तो शायद मुझे कुछ याद आ रहा है, क्योंकि जब मैं विरासत विनिर्देश (कक्षा बी: ए, कक्षा सी: ए) से "आभासी" शब्द को हटा देता हूं, तो यह संकलित और चलाता है। समस्या को हल नहीं करना चाहिए क्योंकि मैं "वर्चुअल फ़ंक्शंस वाले वर्गों को विरासत में मिला हूं"? – EpsilonVector

+0

क्षमा करें कि कक्षा बी थी: सार्वजनिक ए, और इसी तरह ... – EpsilonVector

+0

'कक्षा बी' और' कक्षा सी 'में विधि घोषणाओं से कीवर्ड' आभासी 'निकालें। पुन: संकलित करें और देखें कि क्या होता है। –

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