2016-01-25 4 views
5

मान लीजिए मैं:क्या मुझे उम्मीद है कि एकल विरासत में अपवाद और डाउनकास्ट सूचक को समायोजित नहीं करते हैं?

class Base { 
public: 
    virtual void Nothing() {} 
}; 
class MiddleDerived : public Base { 
    virtual void Nothing() {} 
}; 
class Derived : public MiddleDerived { 
    virtual void Nothing() {} 
}; 

और मेरे कोड इस प्रकार है:

Derived* object = new Derived(); 
Base* base = object; //implicit conversion here 

void* derivedVoid = object; 
void* baseVoid = base; 

मुझे लगता है कि baseVoid == derivedVoid आशा करनी चाहिए?

मुझे पता है कि अधिकांश कार्यान्वयन इस तरह से काम करते हैं लेकिन क्या इसकी गारंटी है?

+0

"पोर्टेबिलिटी" के लिए "भाषा वकील" को प्रतिस्थापित करने पर विचार करें? – Bathsheba

+0

जैसा कि आपने प्रश्न का उच्चारण किया है (उदाहरण के बजाए) आपने संभावना को खोल दिया है कि बेस क्लास में कोई वर्चुअल विधियां नहीं हो सकती हैं (जबकि कुछ व्युत्पन्न कक्षाएं होती हैं)। यह अभी भी "एकल विरासत" हो सकता है लेकिन पॉइंटर्स ** ** बराबर नहीं होंगे। आपके ** उदाहरण ** के लिए, मैं अपने विश्वास का समर्थन करने के लिए पर्याप्त पर्याप्त भाषा वकील नहीं हूं कि यह केवल सामान्य अभ्यास में सत्य है, मानक द्वारा वादा नहीं किया गया है। – JSF

+0

मुझे लगता है कि यह काम करना चाहिए लेकिन मुझे नहीं लगता कि गैर पीओडी कक्षाओं के लिए मानक लेआउट है। – NathanOliver

उत्तर

2

आपको "क्या उम्मीद करनी चाहिए" जो गारंटीकृत है उससे भिन्न हो सकती है।

static_cast विरासत श्रृंखला ऊपर या नीचे पता बदल सकता है।

कैनोनिकल उदाहरण जहां यह अभ्यास में होता है वह है जहां बेस क्लास गैर-पॉलिमॉर्फिक है और एक व्युत्पन्न कक्षा कुछ वर्चुअल फ़ंक्शन पेश करती है, जिसमें कई कंपाइलर के साथ प्रत्येक व्युत्पन्न ऑब्जेक्ट की शुरुआत में एक vtable पॉइंटर प्रस्तुत करते हैं।

2

मुझे लगता है कि मानक है कि इस के साथ सौदों का हिस्सा है §5.2.9 (13)

जिसमें कहा गया है (संक्षेप में) है कि एक शून्य करने के लिए एक टी * डाली * और फिर वापस एक टी करने के लिए * एक ही वस्तु का संदर्भ लेंगे।

हालांकि कोई शर्त नहीं है Derived का पता Base के पते के समान होना चाहिए।

तो मेरा उत्तर होगा, "कोई - कोड है कि उम्मीद है इस समानक बीमार का गठन अपरिभाषित व्यवहार आमंत्रित है।"

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