2009-12-31 15 views
5

का प्रकार प्राप्त करें यदि मैं सही ढंग से समझता हूं, टाइपिड पॉलीमोर्फिज्म में वास्तविक प्रकार निर्धारित कर सकता है, जबकि टाइपफॉफ़ नहीं कर सकता है।वैरिएबल

क्या यह भी सच है कि उनके रिटर्न का उपयोग विभिन्न उद्देश्यों के लिए किया जाता है: टाइपफ़ोफ की वापसी प्रकार के कीवर्ड के रूप में उपयोग की जाती है जो परिवर्तनीय परिभाषित कर सकती है, लेकिन टाइपिड की वापसी नहीं हो सकती है?

क्या दोनों पॉलिमॉर्फिज्म के लिए वास्तविक प्रकार प्राप्त करने का कोई तरीका है और किसी अन्य चर को परिभाषित करने के लिए प्रकार के रूप में वापसी का उपयोग करें? मुझे उम्मीद है कि व्युत्पन्न वर्ग प्रकार को बेस क्लास पर इंगित करने वाले पॉइंटर से प्राप्त करें और व्युत्पन्न कक्षा में एक पॉइंटर या एक पॉइंटर परिभाषित करें। कुछ ऐसा:

baseclass *p = new derivedclass 
typexxx(*p) *pp = dynamic_cast<typexxx(*p) *> (p); 
// would like to convert the pointer from pointing to a base class 
// to its derived class 

बहुत बहुत धन्यवाद!

+6

क्या आप इसका उदाहरण दे सकते हैं कि आप ऐसा क्यों करना चाहते हैं? विरासत पदानुक्रम का मुख्य बिंदु यह है कि आपको सामान्य रूप से वास्तविक प्रकार को जानने की आवश्यकता नहीं होती है। –

+0

बस व्युत्पन्न वर्ग में परिभाषित कुछ सदस्यों को संदर्भित करना चाहते हैं लेकिन आधार वर्ग में नहीं। मुझे यकीन नहीं है कि आधार वर्ग में सदस्य कार्यों को व्युत्पन्न वर्ग के समान नाम के साथ जोड़ना और उन्हें आभासी घोषित करना एक अच्छा विचार है, क्योंकि उन सदस्य कार्य उस विशेष व्युत्पन्न वर्ग के लिए बहुत विशिष्ट हैं और अन्य में आवश्यक नहीं हैं व्युत्पन्न कक्षाएं, और बेस फ़ंक्शन बड़ा होगा यदि मैं उन्हें इसमें जोड़ूं। – Tim

+1

ठीक है, आप डायनामिक_कास्ट के साथ जो भी चाहते हैं वह कर सकते हैं, लेकिन व्युत्पन्न प्रकार पॉइंटर्स बनाने के लिए आपको एक सीढ़ी का उपयोग करने की आवश्यकता होगी। –

उत्तर

7

c++0xdecltype होगा इस तरह इस्तेमाल किया जा सकता है जो:

int someInt; 
decltype(someInt) otherIntegerVariable = 5; 

लेकिन सादे पुराने ग के लिए ++, दुर्भाग्य से, नहीं।

मुझे लगता है कि decltype वास्तव में बहुत मदद नहीं करेगा, भले ही आप पॉलिमॉर्फिक प्रकार, घोषित प्रकार नहीं चाहते हैं। जो भी आप चाहते हैं उसे करने का सबसे आसान तरीका है किसी विशेष प्रकार के गतिशील कलाकारों का प्रयास करना और NULL के लिए जांचना। बी < - - सी

A * p = new AorBorC; // create new object of some sort 

if (dynamic_cast <C*>(p)) { 
    C * c = dynamic_cast <C*>(p); 
    c->CFunc(); 
} 
else if (dynamic_cast <B*>(p)) { 
    B * b = dynamic_cast <B*>(p); 
    b->BFunc(); 
} 
else if (dynamic_cast <A*>(p)) { 
    A * a = dynamic_cast <A*>(p); 
    a->AFunc(); 
} 

कहाँ AFunc, BFunc, CFunc उनके संबंधित कक्षाओं के लिए विशिष्ट हैं, और आभासी नहीं

struct A { 
    virtual ~A() {} 
}; 
struct B : public A {}; 
struct C : public A {}; 

int main() { 
    A* x = new C; 
    if(B* b_ptr = dynamic_cast<B*>(x)) { 
     // it's a B 
    } else if(C* c_ptr = dynamic_cast<C*>(x)) { 
     // it's a C 
    } 
} 
+0

धन्यवाद इवान! लेकिन कभी-कभी मुझे रनटाइम पर टाइप को निर्धारित करने की आवश्यकता होती है जैसे कमांड लाइन तर्क के माध्यम से। मेरी पोस्ट यहां देखें http://stackoverflow.com/questions/1984492/runtime-determine-type-for-c, आप समझेंगे। – Tim

+0

'अगर (बी * बी_पीटीआर = गतिशील_कास्ट (x)) 'और संघ या गलत-स्कोप्ड चर के लिए कोई आवश्यकता नहीं है। इसके अलावा आप अधिक प्राकृतिक लिख सकते हैं 'अन्यथा' के बदले {else ... { –

+0

@ रोगर: आप हर दिन कुछ नया सीखते हैं, मुझे पता नहीं था कि आप एक कथन के अंदर चर घोषित कर सकते हैं। और उचित दायरे में परिणाम। मैं अपना जवाब अपडेट करूंगा। –

3

एक पदानुक्रम एक < मान लिया जाये। जाहिर है, इसे कुछ हद तक अनुकूलित किया जा सकता है।

+0

'अगर (सी * सी = गतिशील_कास्ट (पी)) {/ * सी * /} का उपयोग करें 'दो बार डालने की आवश्यकता नहीं है। –

+1

काफी - मैं लंबी हवाओं से चीजों को स्पष्ट करने की कोशिश कर रहा था। –

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