(यह सवाल शायद Stroustrup के लिए एक संदर्भ के साथ उत्तर दिया जाना चाहिए।)सी ++ आपको सबसे ज्यादा व्युत्पन्न कक्षा में पॉइंटर का अनुरोध करने की अनुमति क्यों नहीं देता है?
यह के रूप में, सबसे व्युत्पन्न वर्ग के सूचक के अनुरोध करने के लिए निम्नलिखित सक्षम होने के लिए अत्यंत उपयोगी लगता है:
class Base { ... };
class DerivedA { ... };
class DerivedB { ... };
class Processor
{
public:
void Do(Base* b) {...}
void Do(DerivedA* d) {...}
void Do(DerivedB* d) {...}
};
list<Base*> things;
Processor p;
for(list<Base*>::iterator i=things.begin(), e=things.end(); i!=e; ++i)
{
p.Do(CAST_TO_MOST_DERIVED_CLASS(*i));
}
लेकिन यह तंत्र सी ++ में प्रदान नहीं किया गया है। क्यूं कर?
अद्यतन, प्रेरित उदाहरण: के बजाय बेस होने के
मान लीजिए और व्युत्पन्न और प्रोसेसर, तुम हो:
class Fruit
class Apple : public Fruit
class Orange: public Fruit
class Eater
{
void Eat(Fruit* f) { ... }
void Eat(Apple* f) { Wash(f); ... }
void Eat(Orange* f) { Peel(f); ... }
};
Eater me;
for each Fruit* f in Fruits
me.Eat(f);
लेकिन यह सी में करने के लिए ++ मुश्किल है, आगंतुक की तरह रचनात्मक समाधान की आवश्यकता होती है पैटर्न। सवाल यह है कि: सी ++ में ऐसा करना मुश्किल क्यों है, जब "CAST_TO_MOST_DERIVED" जैसी कुछ चीज़ इसे अधिक सरल बनाती है?
अपडेट: विकिपीडिया सभी
मुझे लगता है कि पुन्तुस Gagge एक अच्छा जवाब है जानता है। यह करने के लिए Multiple Dispatch पर विकिपीडिया प्रविष्टि से इस बिट जोड़ें:
"Stroustrup कहा गया है कि वह डिजाइन और सी ++ के विकास में मल्टी तरीकों की अवधारणा पसंद है और C++ यह लागू करने पर विचार किया गया है, लेकिन करने का दावा एक कुशल नमूना कार्यान्वयन (आभासी कार्यों के लिए तुलनीय) खोजने में असमर्थ और कुछ संभावित प्रकार अस्पष्टता समस्याओं को हल करने में असमर्थ। वह यह कहता है कि हालांकि यह सुविधा अभी भी अच्छी होगी, कि इसे लगभग डबल प्रेषण या एक प्रकार के आधार पर लागू किया जा सकता है उपरोक्त सी/सी ++ उदाहरण में उल्लिखित लुकअप टेबल, भविष्य की भाषा संशोधन के लिए निम्न प्राथमिकता सुविधा है। "
पृष्ठभूमि के लिए, आप Multi-Methods के बारे में थोड़ा सारांश है, जो एक मैं उल्लेख की तरह एक फोन से बेहतर होगा, क्योंकि वे सिर्फ काम करेंगे पढ़ सकते हैं।
मैंने पहले कुछ क्रैक डिज़ाइन देखा है, लेकिन ... ओह मैन ... 'बेस :: डू()', 'DerivedA :: Do() ',' DerivedB :: Do() 'और समस्या दूर जाता है। –
लेकिन कभी-कभी यह कोई विकल्प नहीं है, या यह अर्थात् सबसे अच्छा विकल्प नहीं है। नीचे डेडएमजी को प्रतिक्रिया देखें। –