2012-08-28 13 views
14

मैं आधार वर्ग एक है, वर्ग बी ए से विरासत, वर्ग सी जो एक टेम्पलेट वर्ग है ए वर्ग डी से विरासत सी से विरासत संबंध इस प्रकार है:टेम्पलेट वर्ग के साथ सी ++ गतिशील कलाकारों के बारे में

 A 
    /\ 
     B C (template class) 
      \ 
      D 

मैं डी ऑब्जेक्ट डी 1 का उपयोग कर एक ऑब्जेक्ट ओ 1 बना सकता हूं, तो मैं डायनामिक कास्ट ओ 1 को एक प्रकार सी ऑब्जेक्ट सी 1 में बनाना चाहता हूं। लेकिन मुझे लगता है कि यह विफल रहता है। मेरा सवाल यह है कि यह प्रक्रिया क्यों विफल हो जाती है?

फिर मैं डी ऑब्जेक्ट डी 1 से सी प्रकार ऑब्जेक्ट सी 2 बनाने के लिए static_cast का उपयोग करता हूं, और मैंने जांच की है कि सी 2 का सही मूल्य डी 2 से है। क्या static_cast का उपयोग करके डी प्रकार से सी प्रकार में परिवर्तित करना हमेशा सफल होता है?

धन्यवाद !!!

+1

अपेक्षित और वास्तविक परिणामों के साथ, पूर्ण कोड पोस्ट करें। ऐसी अनगिनत चीजें हैं जो गलत हो सकती हैं, और हम यह नहीं बता सकते कि यह विशिष्ट कोड के बिना कौन सा है। – Mankarse

+0

क्या आपके बेस क्लास में कोई वर्चुअल फ़ंक्शन है? यदि नहीं, तो आप 'dynamic_cast' का उपयोग नहीं कर सकते हैं। – GManNickG

+0

ध्यान रखें कि इनमें से अधिकतर रूपांतरण केवल पॉइंटर्स और संदर्भों के लिए मान्य हैं, न कि ऑब्जेक्ट्स के लिए। यह आपके वर्णन से स्पष्ट नहीं है कि आप क्या बदल रहे हैं; कुछ उदाहरण कोड उपयोगी होगा। –

उत्तर

13

ठीक है, क्योंकि C एक टेम्पलेट है, यह एक प्रकार का नहीं है और इसे कास्ट के लक्ष्य (न तो स्थिर करने के लिए गतिशील) के रूप में उपयोग नहीं किया जा सकता है, और आप इससे प्राप्त नहीं कर सकते हैं। आपको क्लास टेम्पलेट तत्काल की आवश्यकता है। परिणामी कक्षा कास्ट में उपयोग किया जा सकता है। यही कारण है कि है, निम्नलिखित काम करेगा:

struct A { }; 
template <typename T> struct C : A { }; 
struct D : C<int> { }; 

D d; 
A& a = d; 
C<int>& c = static_cast<C<int>&>(a); // or dynamic_cast, if `A` were polymorphic 
+1

डायनामिक_कास्ट यहां एक अपरिभाषित व्यवहार होगा, क्योंकि आप एक गैर-पॉलिमॉर्फिक प्रकार के साथ नीचे-कास्ट करते हैं (आपको डायनामिक_कास्ट काम करने के लिए कम से कम एक वर्चुअल फ़ंक्शन जोड़ना होगा)। – IceCool

+1

@IceCool सही, मैंने एक स्पष्टीकरण जोड़ा। –

+0

यदि आपके पास 'त्रुटि C2683 है:' dynamic_cast ':' ... 'एक polymorphic प्रकार नहीं है' बस एक वर्ग वर्चुअल विनाशक * को बेस क्लास में जोड़ें: 'वर्चुअल ~ ए() {} ' – 56ka

9
एक प्रकार सी वस्तु सी 1 के लिए

। लेकिन मुझे लगता है कि यह विफल रहता है।

चूंकि C एक टेम्पलेट है, वास्तव में कोई "प्रकार सी" नहीं है। इसके बजाय C<int> या C<Foo> है। (मान लें कि आपके पास एक टेम्पलेट तर्क है)। जब वे विशिष्ट होते हैं तो टेम्पलेट केवल कक्षाएं बन जाते हैं।

तो अगर डी सी की एक विशिष्ट प्रकार से विरासत में मिला:

class D : public C<int> 
{ 
}; 

आप एक C<int> अप करने के लिए dynamic_cast सकता है, लेकिन एक C<float>

कहना बेहतर मदद समझाने, अपने विरासत पेड़ वास्तव में

है करने के लिए नहीं
  A 
    /| \ 
C<float>... C<int> 
      | 
      D 

तो सी डी के माता-पिता नहीं है, लेकिन C<int> इस उदाहरण में है। C के उदाहरणों में वास्तव में रनटाइम में कोई अस्तित्व नहीं है, इसका एकमात्र उदाहरण वास्तव में C<type> का निर्दिष्ट है जो वास्तव में मौजूद है।

+1

न केवल रनटाइम -' सी' एक प्रकार, अवधि नहीं है। –

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

  • कोई संबंधित समस्या नहीं^_^