2010-07-23 16 views
12

टेम्पलेट डक-टाइपिंग और शुद्ध वर्चुअल बेस क्लास विरासत के बीच चयन करने के लिए दिशानिर्देश कौन से हैं? उदाहरण:सी ++ टेम्पलेट बतख-टाइपिंग बनाम शुद्ध वर्चुअल बेस क्लास विरासत

// templates 
class duck { 
    void sing() { std::cout << "quack\n"; } 
}; 

template<typename bird> 
void somefunc(const bird& b) { 
    b.sing(); 
} 

// pure virtual base class 
class bird { 
    virtual void sing() = 0; 
}; 

class duck : public bird { 
    void sing() { std::cout << "quack\n"; } 
} 

void somefunc(const bird& b) { 
    b.sing(); 
} 
+0

अच्छा पन :) (अधिक वर्ण) – Cogwheel

उत्तर

11

टेम्पलेट बतख-टाइपिंग के साथ, आप स्थैतिक बहुरूपता कर रहे हैं। इस प्रकार, आप की तरह

std::vector<bird*> birds; 
birds.push_back(new duck()); 

हालांकि बातें नहीं कर सकते हैं, जब से तुम संकलन समय टाइपिंग पर निर्भर कर रहे हैं, तो आप एक छोटे से अधिक कुशल (कोई आभासी कॉल कोई गतिशील प्रेषण (गतिशील प्रकार के आधार पर) का अर्थ है) कर रहे हैं।

+2

आपकी 'पक्षियों' स्लाइसिंग के अधीन हैं, बजाय पॉइंटर्स का उपयोग करें। –

+3

@Scharron। वर्चुअल कॉल "गतिशील प्रकार की जांच" या किसी भी प्रकार का कारण नहीं बनता है। C++ रनटाइम पर टाइप चेकिंग कभी नहीं करता है। – John

+0

@ जॉर्ज मुझे वास्तव में आपकी टिप्पणी नहीं मिलती है। पॉइंटर्स के साथ भी, कोड काम नहीं करेगा, टुकड़ा असंबंधित है। –

2

यदि चीजों की "टेम्पलेट प्रकृति" व्यापक रूप से फैलती है तो आपके साथ ठीक है, टेम्पलेट्स ("संकलन-समय बतख टाइपिंग") आपको तेज गति दे सकता है ("संकेत का स्तर" से बचने वाला जो वर्चुअल-फ़ंक्शन में निहित है कॉल) हालांकि शायद स्मृति पदचिह्न में कुछ लागत पर (सिद्धांत में, अच्छा सी ++ कार्यान्वयन टेम्पलेट से संबंधित स्मृति मेहेड से बचने के लिए, लेकिन मुझे पूरा भरोसा नहीं है कि ऐसे उच्च गुणवत्ता वाले कंपाइलर सभी प्लेटफॉर्म पर उपलब्ध होंगे आपको बंदरगाह की आवश्यकता है ;-)। तो, कम से कम व्यावहारिक रूप से, यह एक गति/स्मृति व्यापार बंद है। यदि आप जो ऑपरेशन कर रहे हैं वह I/O के रूप में बहुत धीमी है, तो शायद वर्चुअल कॉल से बचने से अपेक्षाकृत छोटी गति लाभ आपके उपयोग के मामले में वास्तव में सामग्री नहीं है।

0

वे दो पूरी तरह से अलग चीजें हैं। एक दूसरे के लिए एक विकल्प नहीं है। टेम्पलेट फ़ंक्शन एक सामान्य ऑपरेशन somefunc() प्रदान करता है जो कि केवल पक्षियों के प्रकार की पूरी श्रेणी पर लागू होता है। इसके पैरामीटर का प्रकार संकलन-समय पर जाना जाना चाहिए। आभासी विधि पक्षियों के लिए विशिष्ट रनटाइम पॉलीमोर्फिक ऑपरेशन प्रदान करती है। पैरामीटर का सटीक प्रकार (this) संकलन-समय पर ज्ञात नहीं होना चाहिए।

चूंकि वे अलग-अलग कार्यक्षमता प्रदान करते हैं, और एक दूसरे के साथ संघर्ष में नहीं हैं, यह दुर्लभ है कि आपको कभी भी दो दृष्टिकोणों के बीच निर्णय लेने की आवश्यकता है। तय करें कि आपको किस कार्यक्षमता की आवश्यकता है, और समझदार दृष्टिकोण स्पष्ट होगा। यह दोनों का संयोजन भी हो सकता है।

(Btw, शब्द "बतख टाइपिंग" यहाँ दुरुपयोग किया जाता है। न तो दृष्टिकोण बतख टाइपिंग है। आप अपने सी ++ शब्दकोश। से वाक्यांश ड्रॉप चाहिए)

+5

मैं कई बिंदुओं पर आपके उत्तर से असहमत हूं। टेम्पलेट का उपयोग सी ++ में कई तरीकों से किया जा सकता है, उनमें से एक प्रभावी रूप से बतख-टाइपिंग है, और आपको इसके बारे में बेहतर जानकारी देना चाहिए। दूसरा, मैं इस बात से असहमत हूं कि यह तय करें कि आपको किस कार्यक्षमता की आवश्यकता है, और समझदार दृष्टिकोण स्पष्ट होगा। प्रोग्रामिंग हमेशा सीधा नहीं है और डिज़ाइन विकल्प हमेशा स्पष्ट नहीं होते हैं। –

2

संकलन समय बनाम रनटाइम। यदि आप बाध्यकारी समय संकलित करना चाहते हैं तो आपको टेम्पलेट्स का उपयोग करने की आवश्यकता है। यदि आप संकलन समय पर प्रकारों को नहीं जानते हैं, तो आपको आभासी विरासत का उपयोग करना चाहिए।

+0

अच्छा और छोटा जवाब। यह कहता है कि एक मध्यवर्ती प्रोग्रामर को यह तय करने की ज़रूरत है कि किस तरह से चयन करना है (एक बार जब वह जानता है कि उसे अपने प्रकार की गतिशील होने की आवश्यकता है, जैसे उन्हें अमूर्त प्रकार के कंटेनर में संग्रहित करना)। मुझे आश्चर्य है कि यह लगभग 3 वर्षों तक क्यों नहीं उभरा। अब यह किया :) – leemes

-2

@ जॉन सही है। यदि आपके पास दो कॉन्वेंट प्रकार के पैरामीटर हैं, तो आपके पास कोई विकल्प नहीं है, आपको टेम्पलेट का उपयोग करना होगा। ऑब्जेक्ट ओरिएंटेड तकनीक रन-टाइम प्रेषण प्रदान करती है लेकिन यह केवल उन प्रकारों के लिए उपलब्ध है जिनके तरीकों में सबसे अधिक भिन्नता तर्क (ऑब्जेक्ट) है।

सबसे रोचक समस्याओं में ऐसे संबंध शामिल हैं जो एन-एरी एन> 1 के साथ हैं इसलिए आपके पास आमतौर पर टेम्पलेट्स का उपयोग करने के अलावा कोई विकल्प नहीं होगा। यह देखने के लिए कि कौन सी तकनीक का सबसे अधिक उपयोग किया जाता है, कृपया मानक लाइब्रेरी की जांच करें।

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