2013-06-26 11 views
17

मैं मैं ऑनलाइन देखा समझने के लिए सी ++ में उत्तराधिकार के क्रम का असर कोशिश कर रहा हूँ .., लेकिन मैं एक स्पष्ट और पर्याप्त जवाब नहीं मिला ...सी ++ एकाधिक वंशानुक्रम आदेश

तो, की खातिर परिभाषित अब कक्षा बी और सी वर्ग

,:

class A1 : public B, public C{ ... }; 
class A2 : public C, public B{ ... }; 

A1 और A2 में क्या अंतर है सवाल, 2 वर्ग हैं मान?

बहुत बहुत धन्यवाद!

+0

इंटरस्टिंग प्रश्न। मैं जवाब जानना चाहता हूं। मुझे यह लिंक मिला - http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr134.htm, जो दावा करता है, " व्युत्पन्न का आदेश केवल विनाशकों द्वारा रचनाकारों और सफाई द्वारा डिफ़ॉल्ट प्रारंभिकरण के आदेश को निर्धारित करने के लिए प्रासंगिक है। " शायद कोई इसकी पुष्टि कर सकता है? – OldProgrammer

उत्तर

11

व्युत्पन्न का क्रम केवल रचनाकारों द्वारा डिफॉल्टर्स द्वारा डिफॉल्ट प्रारंभिकरण के आदेश को निर्धारित करने के लिए प्रासंगिक है और विनाशकों द्वारा सफाई।

व्युत्पन्न का क्रम कन्स्ट्रक्टर (12.6.2), क्लीनअप (12.4), और स्टोरेज लेआउट (9.2, 11.1) द्वारा प्रारंभिक के अर्थशास्त्र द्वारा निर्दिष्ट के अलावा महत्वपूर्ण नहीं है। - अंत टिप्पणी] "(§10.1/2)

आईबीएम की सी ++ प्रलेखन से: Multiple inheritance

+1

यदि आपका लिंक सीधे लिंक के बजाय उद्धरण डालना था तो आपका उत्तर बेहतर होगा। –

+1

बोली वहां सीधे है? या क्या मैं कुछ न कुछ भूल रहा हूं? – Haagenti

+0

सच है, लेकिन कच्चे लिंक tacky हैं:/ –

7

सी ++ 11 स्टैंडर्ड कहते हैं (§10.1):

व्युत्पत्ति के आदेश है महत्वपूर्ण नहीं सिवाय निर्माता (12.6.2), सफाई (12.4), और भंडारण लेआउट (9.2, 11.1) द्वारा प्रारंभ की अर्थ विज्ञान द्वारा निर्दिष्ट के रूप में।

तीन संदर्भित पैराग्राफ पता चलता है कि

  • कंस्ट्रक्टर्स आपको उन्हें लिख (सूची में पहला आधार वर्ग पहले निर्माण किया है) (§12.6.2.10) में कहा जाता है। विभिन्न नियम आभासी आधार वर्गों पर लागू होते हैं जिन्हें हमेशा किसी भी प्रत्यक्ष आधार वर्ग से पहले सबसे व्युत्पन्न कक्षा से बनाया जाता है।
  • विनाशकों को निर्माण के विपरीत क्रम में बुलाया जाता है (सूची में पहली आधार श्रेणी अंतिम रूप से नष्ट हो जाती है)
  • संग्रहण लेआउट निर्दिष्ट नहीं है। आपको स्मृति में कक्षा लेआउट के बारे में कोई धारणा नहीं करनी चाहिए। एकमात्र अपवाद को मानक-लेआउट कक्षाएं (§9) कहा जाता है, जो मूल रूप से एक सी-शैली संरचना है। लेकिन चूंकि कक्षा पदानुक्रम में गैर-स्थैतिक सदस्यों के साथ उन एक से अधिक वर्गों की अनुमति नहीं है, इसलिए सवाल वास्तव में यहां लागू नहीं होता है।

ध्यान दें कि मेमोरी लेआउट महत्वपूर्ण हो सकता है। उदाहरण के लिए, यदि कोई बाहरी लाइब्रेरी बेवकूफ़ सी-स्टाइल बनाता है तो यह मान लेता है कि उस ऑब्जेक्ट का हिस्सा जिसकी दिलचस्पी है, शुरुआत में है, इससे रन टाइम त्रुटियां हो सकती हैं जो डीबग करना मुश्किल है।

+3

मैं कुछ भी "विचार" नहीं करता हूं। "कार्यान्वयन परिभाषित" को सी 8 9 एएनएसआई मानक में परिभाषित किया गया था, और उसी परिभाषा का उपयोग सी ++ में किया जाता है। केवल "क्रियान्वयन परिभाषित" के रूप में वर्णित मानक को "क्रियान्वयन परिभाषित" माना जाता है: ** यदि कुछ "क्रियान्वयन परिभाषित" है, तो कार्यान्वयन को इसे दस्तावेज करने की आवश्यकता है **। कार्यान्वयन निश्चित रूप से कुछ भी दस्तावेज करने की अनुमति है। यह 'ऑपरेटर + 'तर्कों के मूल्यांकन के आदेश का वर्णन कर सकता है, लेकिन इसकी आवश्यकता नहीं है। यह vtable के लेआउट को दस्तावेज कर सकता है, लेकिन इसकी आवश्यकता नहीं है। – curiousguy

+0

"_it लेआउट_ निर्धारित करने के लिए कार्यान्वयन की ज़िम्मेदारी है" जब भी आप 'f (g(), h()) लिखते हैं, तो कार्यान्वयन को दो संभावनाओं में से मूल्यांकन के एक आदेश को भी चुनना चाहिए, लेकिन जिस तरह से इसे चुनता है वह शायद ही कभी होता है का वर्णन किया। कार्यान्वयन कई चीजों के लिए ज़िम्मेदार है जो स्रोत कोड को छोड़कर दस्तावेज नहीं हैं। – curiousguy

+0

@curiousguy जो उत्तर व्यक्त करने का प्रयास कर रहा था वह बिल्कुल है: _ आपको वर्ग लेआउट_ के बारे में कोई धारणा नहीं करनी चाहिए। _implementation-definition_ शब्द को आईएसओ-बोलने और बोलचाल भाषण में थोड़ा अलग अर्थों से पीड़ित है (जो मानक में उपयोग की जाने वाली कई शर्तों के मामले में है)। भ्रम के इस स्रोत से बचने के लिए मैंने जवाब के शब्द को बदल दिया। यदि आपकी मूल पोस्ट में पहले से ही आपके दूसरे से अंतिम जानकारी शामिल है, तो हम इसे बहुत कम पोस्ट में कर सकते थे। हालांकि मेरे साथ रहने के लिए धन्यवाद। – ComicSansMS

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