2016-11-03 7 views
7

मैं अब स्कॉट मेयर्स के अधिक प्रभावी सी ++ पढ़ रहा हूं। Edifying! आइटम 2 का उल्लेख है कि गतिशील_कास्ट न केवल डाउनकास्ट के लिए बल्कि भाई के लिए भी इस्तेमाल किया जा सकता है। क्या कोई भी भाई बहनों के उपयोग के लिए (उचित रूप से) गैर-प्रदूषित उदाहरण प्रदान कर सकता है? यह मूर्ख परीक्षण 0 जैसा प्रिंट करना चाहिए, लेकिन मैं इस तरह के रूपांतरणों के लिए किसी भी एप्लिकेशन की कल्पना नहीं कर सकता।भाई बहनों के गतिशील_कास्ट के लिए उपयोग केस क्या होगा?

#include <iostream> 
using namespace std; 

class B { 
public: 
    virtual ~B() {} 
}; 

class D1 : public B {}; 

class D2 : public B {}; 

int main() { 
    B* pb = new D1; 
    D2* pd2 = dynamic_cast<D2*>(pb); 
    cout << pd2 << endl; 
} 
+0

:

A B \/ C 

आप एक C वस्तु के लिए एक A सूचक है, तो आप एक B सूचक है कि C वस्तु को प्राप्त कर सकते हैं 'क्रॉस-कास्ट' खोजें। इसका उपयोग तब किया जाता है जब एक वर्ग दो अलग-अलग वर्गों से प्राप्त होता है, न कि दूसरी तरफ (जैसा कि आपके प्रश्न में है)। –

उत्तर

6

परिदृश्य आप सुझाव बिल्कुल sidecast से मेल नहीं खाता है, जो आम तौर पर दो वर्गों में से संकेत दिए गए/संदर्भ, और संकेत के बीच कास्टिंग के लिए प्रयोग किया जाता है/संदर्भ वर्ग की एक वस्तु है जो दोनों से निकला है की बात कर रहे दो कक्षाएं। यहाँ इसके लिए एक उदाहरण है:

struct Readable { 
    virtual void read() = 0; 
}; 
struct Writable { 
    virtual void write() = 0; 
}; 

struct MyClass : Readable, Writable { 
    void read() { std::cout << "read"; } 
    void write() { std::cout << "write"; } 
}; 
int main() 
{ 
    MyClass m; 
    Readable* pr = &m; 

    // sidecast to Writable* through Readable*, which points to an object of MyClass in fact 
    Writable* pw = dynamic_cast<Writable*>(pr); 
    if (pw) { 
     pw->write(); // safe to call 
    } 
} 

LIVE

2

यह पार डाली, और जब एक वर्ग दो अलग अलग वर्गों (नहीं दूसरी तरह के आसपास, से विरासत यह प्रयोग किया जाता है में दिखाया गया है कहा जाता है अपने सवाल)।

उदाहरण के लिए

, निम्नलिखित वर्ग पदानुक्रम दिया:

A* ap = new C; 
B* bp = dynamic_cast<B*>(ap); 
संबंधित मुद्दे