2010-05-05 14 views
6
class Base 
{ 
public: 
type1 m_Pants; 
}; 

class Derived : Base 
{ 
public: 
type2 m_Pants 
}; 

यह अनिवार्य रूप से एक त्रुटि के रूप में चिह्नित नहीं जा सके थे के रूप में नहीं हो रही चिह्नित किये, लेकिन एक परियोजना भर clobbering के सभी प्रकार और मुद्दों बनाने गया था।वस्तुओं एक त्रुटि

क्या किसी को तकनीकी की जानकारी है जो इसे ध्वजांकित नहीं करेगा?

उत्तर

1

यह वही करता है जो इसे करना है। व्युत्पन्न आधार आधार छाया।

+1

कार्यों को ओवरलोड और ओवरराइड किया जा सकता है। सदस्य नहीं कर सकते 'व्युत्पन्न :: m_pants' और 'बेस :: m_pants' पूरी तरह से दो अलग-अलग चर हैं। यदि आप 'std :: cout << sizeof (base) << '' << sizeof (व्युत्पन्न) << std :: endl; 'एक छोटे परीक्षण कार्यक्रम में, आप देखेंगे कि' व्युत्पन्न 'आकार में बड़ा है 'Base'। आप वेरिएबल्स को उसी नाम और प्रकार का उपयोग भी कर सकते हैं, लेकिन वे अभी भी अलग-अलग चर हैं क्योंकि वे विभिन्न वर्गों से संबंधित हैं। – Dustin

+1

आह, आपने "ओवरराइड" से "छाया" तक उपयोग की गई शब्द को बदल दिया, इस प्रकार मेरी टिप्पणी को अमान्य कर दिया। इसे ठीक करने के लिए धन्यवाद। :) – Dustin

+0

@ डस्टिन, मेरी शब्दावली में सुधार के लिए धन्यवाद। –

7

यह एक त्रुटि के रूप में चिह्नित नहीं किया जा रहा है क्योंकि यह कोई त्रुटि नहीं है। ऐसा कुछ भी नहीं है जो कहता है कि आपके पास व्युत्पन्न कक्षा में सदस्य नहीं हो सकते हैं जिन्हें बेस क्लास के सदस्यों के समान नाम दिया गया है।

आप प्रकार Derived का एक उद्देश्य obj है, तो obj.m_PantsDerived में m_Pants को दर्शाता है। यदि आप मूल सदस्य को संदर्भित करना चाहते हैं, तो आप obj.Base::m_Pants का उपयोग करके ऐसा कर सकते हैं।

आप Base के एक सदस्य समारोह में हैं या एक Base* उस प्रकार Derived की एक वस्तु की ओर इशारा करता है, तो m_Pants हमेशा की तरह, Base के सदस्य को संदर्भित करता है वर्ग Derived और का ज्ञान नहीं है उन संदर्भों में है क्योंकि इसके सदस्य हैं।

अच्छा, यह कोड त्रुटि नहीं है; यह लगभग निश्चित रूप से एक डिजाइन त्रुटि है।

+0

मैंने सी ++ बिल्डर 6 में 'int val = obj.base :: m_Pants' को आजमाया है और संकलन त्रुटि मिली है: ** E2247' बेस :: m_Pants 'पहुंच योग्य नहीं है ** (m_Pants सार्वजनिक है) –

+0

यह केवल संकलित करता है funcs 'public प्राप्त करें/सेट करें: int getBase() {वापसी बेस :: m_Pants}' –

+3

@Alexander: ठीक है, उदाहरण कोड में, 'व्युत्पन्न' को 'बेस' से निजी रूप से विरासत में मिला है, इसलिए, आप सही हैं कि' टी काम नहीं आपको इसे सार्वजनिक रूप से वारिस करने के लिए बदलना होगा। –

1

एक चर दूसरे को छाया दे रहा है। ऐसा लगता है कि आपने सदस्य चर नाम x घोषित किया था और उसके बाद एक सदस्य फ़ंक्शन था जिसने अपना x घोषित किया था, सिवाय इसके कि, चर के वर्ग में से एक चर है और एक व्युत्पन्न कक्षा में है।

int func(int x) 
{ 
    return x; 
} 

x का मूल्य वापसी होगी आप में पारित कर दिया, नहीं सदस्य चर x की कि। एक चर "दूसरे" छाया "छाया"। यही कारण है कि अपने चर का नाम देना एक अच्छा विचार है ताकि उनके पास कभी ऐसे नाम न हों जो संघर्ष कर सकें।

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