यदि वे संबंधित हैं
आइए एक पल के लिए मान लें कि B
वास्तव में इसका आधार है D
। फिर कॉल के लिए check
, दोनों संस्करण व्यवहार्य हैं क्योंकि Host
इन्हें D*
और में परिवर्तित किया जा सकता है B*
। यह एक उपयोगकर्ता परिभाषित रूपांतरण अनुक्रम के रूप में द्वारा वर्णित है 13.3.3.1.2
से Host<B, D>
करने के लिए D*
और B*
क्रमशः। रूपांतरण कार्यों को खोजने के लिए जो कक्षा को परिवर्तित कर सकते हैं, निम्नलिखित उम्मीदवार कार्यों को पहले check
फ़ंक्शन के अनुसार संश्लेषित किया जाता है13.3.1.5/1
D* (Host<B, D>&)
पहला रूपांतरण फ़ंक्शन एक उम्मीदवार नहीं है, क्योंकि B*
इसे परिवर्तित नहीं किया जा सकता है D*
।
दूसरे फ़ंक्शन के लिए, निम्नलिखित उम्मीदवार मौजूद हैं:
B* (Host<B, D> const&)
D* (Host<B, D>&)
वे दो रूपांतरण फ़ंक्शन उम्मीदवार हैं जो होस्ट ऑब्जेक्ट लेते हैं। पहला इसे कॉन्स्ट रेफरेंस द्वारा लेता है, और दूसरा नहीं। इस प्रकार दूसरा नॉन-कास्ट *this
ऑब्जेक्ट ( निहित ऑब्जेक्ट तर्क ) के लिए एक बेहतर मैच है 13.3.3.2/3b1sb4
और इसका उपयोग B*
दूसरे check
फ़ंक्शन के लिए परिवर्तित करने के लिए किया जाता है ।
यदि आप कांस्ट को हटा देंगे , तो हमारे पास निम्नलिखित उम्मीदवार होंगे
B* (Host<B, D>&)
D* (Host<B, D>&)
इसका मतलब यह होगा कि हम अब कब्ज का चयन नहीं कर सकते। सामान्य अधिभार रिज़ॉल्यूशन परिदृश्य में, कॉल अब अस्पष्ट होगा क्योंकि आमतौर पर रिटर्न प्रकार अधिभार रिज़ॉल्यूशन में भाग नहीं लेंगे। रूपांतरण कार्यों के लिए, हालांकि, एक पिछले दरवाजे है। यदि दो रूपांतरण कार्य समान रूप से अच्छे हैं, तो उनमें से वापसी प्रकार तय करता है कि कौन सबसे अच्छा है 13.3.3/1
। इस प्रकार, यदि आप कास्ट हटाएंगे, तो पहले लिया जाएगा, क्योंकि से B*
बेहतर रूपांतरित करता है ।B*
D*
B*
अब क्या उपयोगकर्ता परिभाषित रूपांतरण अनुक्रम बेहतर है? दूसरे या पहले चेक फ़ंक्शन के लिए एक? नियम यह है कि उपयोगकर्ता परिभाषित रूपांतरण अनुक्रमों की तुलना केवल तभी की जा सकती है जब वे उसी रूपांतरण फ़ंक्शन या कंस्ट्रक्टर का उपयोग करते हैं 13.3.3.2/3b2
। यह वास्तव में यहाँ है: दोनों दूसरे रूपांतरण फ़ंक्शन का उपयोग करते हैं। ध्यान दें कि इस प्रकार कास्ट महत्वपूर्ण है क्योंकि यह कंपाइलर को दूसरे रूपांतरण फ़ंक्शन को लेने के लिए मजबूर करता है।
चूंकि हम उनकी तुलना कर सकते हैं - कौन सा बेहतर है? नियम यह है कि गंतव्य प्रकार जीत (फिर से 13.3.3.2/3b2
) में रूपांतरण फ़ंक्शन के वापसी प्रकार से बेहतर रूपांतरण । इस मामले में, की तुलना में D*
बेहतर धर्मान्तरित । इस प्रकार पहले फ़ंक्शन का चयन किया जाता है और हम इनहेरिटेंस को पहचानते हैं!D*
B*
ध्यान दें कि जब से हम करने के लिए आवश्यक कभी नहीं वास्तव में एक आधार वर्ग में बदलने का है, हम इस तरह पहचान सकते हैं निजी वंशानुक्रम क्योंकि है कि क्या हम एक से परिवर्तित कर सकते हैं D*
एक करने के लिए B*
के अनुसार विरासत के रूप पर निर्भर नहीं है4.10/3
यदि वे संबंधित नहीं हैं
अब मान लेते हैं कि वे विरासत से संबंधित नहीं हैं। इस प्रकार पहले कार्य के लिए हमारे पास निम्नलिखित उम्मीदवार हैं
D* (Host<B, D>&)
और दूसरे के लिए अब हमारे पास एक और सेट है
B* (Host<B, D> const&)
जब से हम नहीं बदल सकते D*
करने के लिए B*
अगर हम एक विरासत संबंध नहीं मिला है, अब हम दो उपयोगकर्ता परिभाषित रूपांतरण दृश्यों के बीच कोई आम रूपांतरण समारोह है! इस प्रकार, हम अस्पष्ट होंगे यदि इस तथ्य के लिए नहीं कि पहला फ़ंक्शन एक टेम्पलेट है। जब कोई नॉन-टेम्प्लेट फंक्शन होता है तो टेम्प्लेट दूसरी पसंद होते हैं 13.3.3/1
। इस प्रकार, हम गैर-टेम्प्लेट फ़ंक्शन का चयन करते हैं (दूसरा एक) और हम पहचानते हैं कि कोई विरासत नहीं है B
और D
!