2012-02-14 10 views
23

कहते हैं कि हम शुद्ध आभासी तरीके (एक अंतरफलक) के साथ एक सार आधार वर्ग IBase है के रूप में एक समारोह लेने आधार वर्ग के संदर्भ द्वारा व्युत्पन्न वर्ग पारित करने के लिए यह संभव है।एक पैरामीटर

फिर हम बेस क्लास से CFoo, CFoo2 प्राप्त करते हैं।

और हम एक समारोह को पता है कि कैसे घोषित के साथ काम करना है।

Foo(IBase *input); 

सामान्य परिदृश्य इन मामलों में इस तरह है:

IBase *ptr = static_cast<IBase*>(new CFoo("abc")); 
Foo(ptr); 
delete ptr; 

लेकिन सूचक प्रबंधन से परहेज किया जाना करने के लिए बेहतर है, इसलिए वहाँ इस तरह के परिदृश्य में संदर्भ का उपयोग करने के लिए एक तरीका है?

CFoo inst("abc"); 
Foo(inst); 

जहां Foo है:

Foo(IBase &input); 
+2

हां, आपके प्रश्न में आपके पास क्या आदर्श है। – ildjarn

+28

हां; polymorphism दोनों पॉइंटर्स और संदर्भों के लिए काम करता है। और कास्टिंग बंद करो, कृपया। हम हॉलीवुड में नहीं हैं। –

उत्तर

39

हां। आपको अपनी वस्तुओं को उजागर करने की ज़रूरत नहीं है। व्युत्पन्न प्रकारों के सभी संदर्भ/पॉइंटर्स जरूरी होने पर आधार ऑब्जेक्ट संदर्भ/पॉइंटर्स में अंतर्निहित रूप से परिवर्तित हो जाते हैं।

तो:

IBase* ptr = new CFoo("abc"); // good 
CFoo* ptr2 = static_cast<CFoo*>(ptr); // good 
CFoo* ptr3 = ptr; // compile error 

CFoo instance("abc"); 
IBase& ref = instance; // good 
CFoo& ref2 = static_cast<CFoo&>(ref); // good 
CFoo& ref3 = ref; // compile error 

आप आप, dynamic_cast उपयोग करने पर विचार करने के लिए करता है, तो अपने प्रकार के बहुरूपी होते हैं चाहते हो सकता है खिन्न करने के लिए है जब।

+0

मुझे पता चला कि मेरी समस्या कहां थी। मैं 'फू (सीएफयू ("एबीसी")) का उपयोग कर रहा था;' जो संकलन नहीं कर रहा था। – Coder

+3

@Coder: मामले में आप जानकारी नहीं है तो कारण यह है कि एक समस्या है है, क्योंकि आप 'गुजर रहे Foo' एक rvalue, और rvalues ​​गैर स्थिरांक lvalue संदर्भ (यानी करने के लिए बाध्य नहीं कर सकते, यदि' 'Foo' थे फू (आईबीएएस कॉन्स एंड इनपुट); इसके बजाए, यह संकलित होगा)। – ildjarn

0

तुम बस के रूप में आप एक सूचक कर सकते हैं एक वस्तु डाल सकता। मुझे याद है कि यह char से unsigned char और कई अन्य संकेतों को बदलते समय बदलते समय यह आम था।

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