2011-01-29 13 views
5

कहें कि मेरे पास इस उदाहरण की तरह कुछ कक्षाएं हैं।विरासत मेमोरी स्टोरेज के साथ ऑब्जेक्ट्स

class A { 
    int k, m; 
public: 
    A(int a, int b) { 
      k = a; 
      m = b; 
    } 
}; 

class B { 
    int k, m; 
public: 
    B() { 
      k = 2; 
      m = 3; 
    } 
}; 

class C : private A, private B { 
    int k, m; 
public: 
    C(int a, int b) : A(a, b) { 
      k = b; 
      m = a; 
    } 
}; 

अब, कक्षा सी ऑब्जेक्ट में, एक विशिष्ट तरीके से संग्रहीत चर हैं? मुझे पता है कि पीओडी ऑब्जेक्ट में क्या होता है, लेकिन यह एक पीओडी ऑब्जेक्ट नहीं है ...

उत्तर

2

अध्याय 10, व्युत्पन्न वर्गों की शुरूआत में, सी ++ मानक का उल्लेख है:

जिस क्रम में आधार वर्ग subobjects सबसे व्युत्पन्न वस्तु (1.8) में आवंटित किए जाते हैं अनिर्दिष्ट है।

तो, अपने उदाहरण में C वस्तुओं प्रत्येक प्रकार A का एक आधार वर्ग subobject और प्रकार B का एक आधार वर्ग subobject है, लेकिन A आधार सदस्य पहले या बाद में B आधार सदस्य अनिर्दिष्ट है आता है या नहीं।

0

हालांकि मुझे यकीन नहीं है कि मानक द्वारा आवश्यक है, किसी भी उचित कार्यान्वयन में मुझे पता है कि वे इसमें संग्रहित हैं आदेश: ए :: के, ए :: एम, बी :: के, बी :: एम, सी :: के, सी :: एम (संभवतः हार्डवेयर की आवश्यकताओं के अनुसार गठबंधन)। इस ज्ञान में एकमात्र व्यावहारिक कारण यह है कि मुझे यह समझने की ज़रूरत है कि आपको समझने की आवश्यकता है कि यदि आप सी को पॉइंटर को बी के लिए पॉइंटर डालते हैं, तो इसका मूल्य (पता) अलग होगा, इसलिए आपको इस तरह के बारे में बहुत सावधान रहना चाहिए कास्ट (उदाहरण के लिए, reinterpret_cast <> का उपयोग न करें)।

+0

यह कई लागू करने के लिए शायद सच है, लेकिन मुझे नहीं लगता कि कोई गारंटी है। –

+0

@jdv, सच है, यह शायद कार्यान्वयन-विशिष्ट है, लेकिन मैं इसे किसी भी अन्य तरीके से लागू नहीं कर सकता। हालांकि, जवाब में एक नोट जोड़ना चाहिए। –

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