एक स्थिति पर विचार के लिए एक गैर आभासी आधार वर्ग को शामिल:
+-------------+
| A: int a; |
+-------------+
| B: int b; |
+-------------+
| A: int a; |
+-------------+
| C: int c; |
+-------------+
| D: int d; |
+-------------+
D
समाप्त होता है:
class A { int a; }
class B : public A { int b; }
class C : public A { int c; }
class D : public B, public C { int d; }
यहाँ एक संभव स्मृति लेआउट है यह वही है मैं विषय से संबंधित मिल सकता है दो A
सबोबजेक्ट्स के साथ, क्योंकि यह B
और C
से प्राप्त होता है और दोनों में A
सबोबजेक्ट होता है।
सदस्य चर के पॉइंटर्स आमतौर पर ऑब्जेक्ट की शुरुआत से पूर्णांक ऑफसेट के रूप में कार्यान्वित किए जाते हैं। इस मामले में, int a
के लिए A
ऑब्जेक्ट में पूर्णांक ऑफसेट शून्य है। तो A
के int a
के सूचक "शून्य के पूर्णांक ऑफसेट हो सकते हैं।
एक करने के लिए "प्रकार A
की int a
सूचक" एक परिवर्तित करने के लिए "प्रकार B
की int a
सूचक," तुम सिर्फ एक पूर्णांक A
subobject B
में स्थित (प्रथम A
subobject) करने के लिए ऑफसेट की जरूरत है।
एक करने के लिए "प्रकार A
की int a
सूचक" एक परिवर्तित करने के लिए "प्रकार C
की int a
सूचक," तुम सिर्फ एक पूर्णांक A
subobject C
में स्थित (दूसरा A
subobject) करने के लिए ऑफसेट की जरूरत है।
के बाद से संकलक जानता है, जहां B
और C
A
के सापेक्ष है, संकलक कैसे A
से B
या C
को खिन्न करने पर पर्याप्त जानकारी नहीं है।
अब एक स्थिति एक आभासी आधार वर्ग को शामिल करने पर विचार:
struct A { int a; }
struct B : virtual public A { int b; }
struct C : virtual public A { int c; }
struct D : public B, public C { int d; }
संभव स्मृति लेआउट:
+-------------+
| B: ptr to A | ---+
| int b; | |
+-------------+ |
| C: ptr to A | ---+
| int c; | |
+-------------+ |
| D: int d; | |
+-------------+ |
| A: int a; | <--+
+-------------+
आभासी आधार वर्ग आम तौर पर B
और C
(जो वस्तुतः A
से निकाले जाते हैं) होने से लागू किया जाता है एक A
subjobject के लिए एक सूचक शामिल है। A
सबोबजेक्ट के पॉइंटर्स की आवश्यकता है क्योंकि का स्थान B
और C
के सापेक्ष स्थिर नहीं है।
यदि सब हम था एक था "प्रकार A
की int a
सूचक," हम, "प्रकार B
की int a
सूचक" एक करने के लिए इसे कास्ट करने के लिए B
और C
subobjects के स्थान के बाद से भिन्न हो सकते हैं सक्षम नहीं होगा A
के सापेक्ष। A
में B
और न ही C
पर बैक-पॉइंटर्स नहीं हैं, इसलिए हमारे पास काम करने के लिए डाउनकास्ट के लिए पर्याप्त जानकारी नहीं है।
+1 – Bill