मैंने सी ++ पर एक पुस्तक देखी जिसमें उल्लेख किया गया है कि स्थिर कास्ट का उपयोग करके विरासत पदानुक्रमों को नेविगेट करना गतिशील कलाकारों का उपयोग करने से अधिक कुशल है।विरासत कास्ट बनाम डाइमैमिक कास्ट विरासत पदानुक्रमों के लिए
उदाहरण:
#include <iostream>
#include <typeinfo>
using namespace std;
class Shape { public: virtual ~Shape() {}; };
class Circle : public Shape {};
class Square : public Shape {};
class Other {};
int main() {
Circle c;
Shape* s = &c; // Upcast: normal and OK
// More explicit but unnecessary:
s = static_cast<Shape*>(&c);
// (Since upcasting is such a safe and common
// operation, the cast becomes cluttering)
Circle* cp = 0;
Square* sp = 0;
// Static Navigation of class hierarchies
// requires extra type information:
if(typeid(s) == typeid(cp)) // C++ RTTI
cp = static_cast<Circle*>(s);
if(typeid(s) == typeid(sp))
sp = static_cast<Square*>(s);
if(cp != 0)
cout << "It's a circle!" << endl;
if(sp != 0)
cout << "It's a square!" << endl;
// Static navigation is ONLY an efficiency hack;
// dynamic_cast is always safer. However:
// Other* op = static_cast<Other*>(s);
// Conveniently gives an error message, while
Other* op2 = (Other*)s;
// does not
} ///:~
हालांकि, दोनों गतिशील कलाकारों और स्थिर डाली (जैसा कि ऊपर लागू किया) RTTI सक्षम की जरूरत है इस तरह के नेविगेशन काम करने के लिए। यह केवल गतिशील कलाकारों को कक्षा पदानुक्रम को बहुरूप होने की आवश्यकता है (यानी बेस क्लास कम से कम एक वर्चुअल फ़ंक्शन है)।
स्थैतिक कलाकारों के लिए यह दक्षता लाभ कहां से आता है? पुस्तक का उल्लेख है कि डायनामिक कास्ट टाइप-सुरक्षित डाउनकास्टिंग करने का पसंदीदा तरीका है।
मेरी आंखें ओउ। इंडेंट? –
आपके संदेश को पुस्तक के लेखक को व्यक्त करेगा। – Ankur
सी-स्टाइल कास्ट '(अन्य *) एस 'अनिवार्य रूप से' reinterpret_cast 'के समान है, इस मामले में, यही कारण है कि यह चेतावनी के बिना संकलित करता है (आप अनिवार्य रूप से संकलक को चिंता न करने के बारे में बता रहे हैं, आप जानते हैं कि आप क्या जानते हैं कर रहे हैं) –
Attila