C++ Common Knowledge: Essential Intermediate Programming में Item 28 Meaning of Pointer Comparison) सी में वस्तु सूचक के प्रमुख बताते हैं ++:
सी ++ में, एक वस्तु से अधिक, मान्य पतों के हो सकते हैं, और सूचक तुलना पते के बारे में सवाल नहीं है। यह वस्तु पहचान के बारे में एक सवाल है।
कोड पर एक नज़र डालें:
class A{};
class B{};
class C: public A, public B {};
C c;
C* pc = &c;
B* pb = &c;
A* pa = &c;
class C
class A
और class B
दोनों से निकला है, इसलिए class C
class A
और class B
दोनों है। ऑब्जेक्ट C c
में 3 मान्य पते हैं: class A
, class B
और class C
के लिए पता। कार्यान्वयन संकलक पर निर्भर करता है, तो आप class C
की स्मृति लेआउट कल्पना नहीं कर सकते हैं, और यह इस तरह हो सकता है:
---------- <- pc (0x7ffe7d10e1e0)
| |
---------- <- pa (0x7ffe7d10e1e4)
| A data |
---------- <- pb (0x7ffe7d10e1e8)
| B data |
----------
| C data |
----------
उपरोक्त मामले में, हालांकि pc
, pa
और pb
का पता मूल्य ही नहीं हैं, वे सभी एक ही ऑब्जेक्ट (c
) का संदर्भ लेते हैं, इसलिए संकलक को यह सुनिश्चित करना चाहिए कि pc
pa
और pb
, यानी pc == pa
और pc == pb
दोनों के बराबर तुलना करता है। कंपाइलर उचित ऑफसेट की तुलना में पॉइंटर्स में से किसी एक के मूल्य को समायोजित करके इस तुलना को पूरा करता है। जैसे,
pc == pa
लिए अनुवाद किया है: A
के बाद से
pc ? ((uintptr_t)pc + 4 == (uintptr_t)pa) : (pa == 0)
अन्य बातों के अलावा, और B
कोई विरासत रिश्ता है, हम pa
और pb
सीधे तुलना नहीं कर सकते।
अपने प्रश्नों के लिए:
(1) does pa point to a valid A object?
(2) does pb point to a valid B object?
Yes, refer the above diagram.
(3) pc == (C*) pa ?
(4) pc == (C*) pb ?
Yes, No need to add (C*).
(5) does pa == pb ?
No. We can't compare them.
आप == से क्या मतलब है? जाहिर है, पते एक ही हैं। –
पते एक दूसरे के समान नहीं हैं। –
मैंने जो एकाधिक विरासत (आभासी) देखा है, के एक कार्यान्वयन में, कुछ ऑफसेट बी के गुणों और विधियों तक पहुंचने के लिए व्युत्पन्न वर्ग के ऑब्जेक्ट के मूल पते में जोड़ा गया है। हालांकि यह उपयोगकर्ता के लिए दृश्यमान नहीं है क्योंकि संकलक आंतरिक रूप से इसका उपयोग करता है। इसलिए आपके कार्यक्रम में आप अभी भी देख सकते हैं कि ए, बी और सी का पता समान है। – mukeshkumar