मैं समझता हूं कि गतिशील/स्थैतिक बहुरूपता अनुप्रयोग डिजाइन और आवश्यकताओं पर निर्भर करती है। हालांकि, क्या यह सलाह दी जाती है कि यदि संभव हो तो गतिशील पर स्थैतिक बहुरूपता का चयन करें? जबकि अभी भी टेम्पलेट के रूप में एक इंटरफेस प्रदान नहीं vtable देखने भूमि के ऊपर: विशेष रूप से, मैं अपने आवेदन में निम्नलिखित 2 डिजाइन विकल्प देख सकते हैं, जो दोनों के खिलाफ की सलाह दी हो रहे हैं:सी ++ में डायामी बनाम स्टेटिक पॉलिमॉर्फिज्म: जो बेहतर है?
CRTP का उपयोग कर स्टेटिक बहुरूपता लागू आधार वर्ग लेकिन, सही वर्ग/विधि है, जो खतरनाक
गतिशील बहुरूपता है उपयोग करने के लिए स्विच और static_cast का उपयोग किया:, इंटरफेस (शुद्ध आभासी वर्ग) को लागू की तरह accessors/mutators भी तुच्छ कार्यों के लिए देखने लागत जोड़
मेरा आवेदन बहुत समय महत्वपूर्ण है, इसलिए स्थैतिक बहुरूपता के पक्ष में हूं। लेकिन यह जानने की जरूरत है कि बहुत से static_cast का उपयोग करना खराब डिज़ाइन का संकेत है, और विलंबता के बिना इसे कैसे बचें।
संपादित करें: अंतर्दृष्टि के लिए धन्यवाद। एक विशिष्ट मामला लेना, इनमें से कौन सा बेहतर दृष्टिकोण है?
class IMessage_Type_1
{
virtual long getQuantity() =0;
...
}
class Message_Type_1_Impl: public IMessage_Type_1
{
long getQuantity() { return _qty;}
...
}
या
template <class T>
class TMessage_Type_1
{
long getQuantity() { return static_cast<T*>(this)->getQuantity(); }
...
}
class Message_Type_1_Impl: public TMessage_Type_1<Message_Type_1_Impl>
{
long getQuantity() { return _qty; }
...
}
नोट कई mutators/प्रत्येक वर्ग में accessors देखते हैं, और मैं अपने आवेदन में एक अंतरफलक निर्दिष्ट करने की आवश्यकता है कि। स्थिर polymorphism में, मैं सिर्फ एक बार स्विच - संदेश प्रकार प्राप्त करने के लिए। हालांकि, गतिशील बहुरूपता में, मैं प्रत्येक विधि कॉल के लिए वर्चुअल फ़ंक्शंस का उपयोग कर रहा हूं। क्या यह स्थिर पॉली का उपयोग करने का मामला नहीं बनाता है? मेरा मानना है कि सीआरटीपी में static_cast काफी सुरक्षित है और कोई प्रदर्शन जुर्माना नहीं है (समयबद्ध संकलन)?
एक स्विच-केस संरचना में एक vtable का उपयोग करने के समान जटिलता है। – user877329
मुझे यकीन नहीं है कि आप स्थिर पॉलीमोर्फिज्म का उपयोग करते समय बहुत सारे static_cast और स्विच के साथ क्यों समाप्त होते हैं - क्या आप कुछ उदाहरण कोड दिखा सकते हैं? –
@ माइकल एंडरसन: यदि आप एक ऐसी स्थिति में स्थैतिक बहुरूपता का उपयोग करने की कोशिश करते हैं, जिसके लिए गतिशील बहुरूपता की आवश्यकता होती है तो आपको वह मिल जाएगा। उस स्थिति में इसे फिर से शुरू करने की कोशिश करने के बजाय गतिशील बहुरूपता का उपयोग करना लगभग निश्चित रूप से बेहतर होता है। –