मैं काफी लंबे समय तक सी ++ में एकाधिक विरासत का उपयोग कर रहा हूं, लेकिन केवल आज ही एहसास हुआ कि यह संकेत दे सकता है कि उप-वर्गों में से एक के रूप में संदर्भित करते समय पॉइंटर पते भिन्न हो सकते हैं।सबक्लास कास्टिंग, और सूचक पता
उदाहरण के लिए, अगर मेरे पास है:
class ClassA{
public:
int x;
int y;
ClassA(){
cout << "ClassA : " << (unsigned int)this << endl;
}
};
class ClassC{
public:
int cc;
int xx;
ClassC(){
cout << "ClassC : " << (unsigned int)this << endl;
}
};
class ClassB : public ClassC, public ClassA{
public:
int z;
int v;
ClassB(){
cout << "ClassB : " << (unsigned int)this << endl;
}
};
int main(){
ClassB * b = new ClassB();
}
वर्ग एक और वर्ग सी अलग-अलग पतों जब निर्माता मुद्रित है।
फिर भी, जब मैं उन्हें एक दूसरे के लिए वापस कास्ट करने के लिए प्रयास करते हैं, यह सिर्फ स्वतः काम करता है:
ClassA * the_a = (ClassA*)b;
cout << "The A, casted : " << (unsigned int)the_a << endl;
ClassB * the_b = (ClassB*)the_a;
cout << "The B, casted back : " << (unsigned int)the_b << endl;
मैं इस प्रकार की जानकारी कोड से संकलक द्वारा प्राप्त किया जा सकता है लगता है, लेकिन यह करने के लिए सुरक्षित है मान लें कि यह सभी कंपाइलरों पर काम करता है?
अतिरिक्त प्रश्न: क्या ऑर्डर को बल देना संभव है जिसमें सबक्लास स्थान जाते हैं? उदाहरण के लिए, यदि मुझे प्रथम श्रेणी में रहने के लिए क्लासए की आवश्यकता है (अनिवार्य रूप से, उसी सूचक स्थान को साझा करें) क्लाससी के रूप में जो इसे उपclass करता है, क्या मुझे इसे सबक्लास के घोषणापत्र में पहले रखना होगा? अद्यतन ठीक है, ऐसा लगता है कि ऑर्डर को मजबूर करना संभव नहीं है। क्या अभी भी संरचना के "रूट" पते, उपclass को आवंटित पते की शुरुआत सुपरक्लास स्तर पर खोजना संभव है? उदाहरण के लिए, कक्षा ए से कक्षा बी का पता प्राप्त करना।
मुझे विश्वास नहीं है कि आप _ "रूट" _ पता प्राप्त कर सकते हैं। हालांकि मैं इसके बारे में एक अलग सवाल पूछूंगा। मानक से AFAICT, यह भी गारंटी नहीं है कि बेस क्लास के सदस्यों या उप-वस्तुओं को कम स्मृति पते में रखा गया है। दूसरे शब्दों में, इस बात की कोई गारंटी नहीं है कि 'the_a' के पास' the_b' या किसी भी प्रकार की तुलना में कम पता है। –