2012-01-19 3 views
35

एक बार पहले, मुझे यकीन था कि आप ऐसा नहीं कर सके, लेकिन दूसरे दिन मैं कुछ कोड के साथ खेल रहा था और यह संकलन और काम करना प्रतीत होता था। मैं बस यह सत्यापित करना चाहता हूं कि मैं सिर्फ भाग्यशाली नहीं हूं। क्या एक टेम्पलेट क्लास में शुद्ध आभासी फ़ंक्शन हो सकता है - जो मुझे लगता है कि केवल सादा वर्चुअल विधियां भी विनाशक के लिए वैध होंगी?एक टेम्पलेट वर्ग के भीतर शुद्ध वर्चुअल विधियों की अनुमति है?

template <typename WordType> class DataSource 
{ 
public: 
    DataSource(); 
    DataSource(DataSource const& other); 
    virtual ~DataSource(); 

    virtual void Put(
     WordType const* const data, 
     unsigned int const wordCount) = 0; 
} 

मैं इसे देख कोशिश की है ऑनलाइन और जो कुछ मैं कर लिया है आप इस जैसे एक आभासी विधि (शुद्ध या अन्यथा) एक सामान्य वर्ग में नहीं हो सकता है जो:

class DataSource 
{ 
public: 
    DataSource(); 
    DataSource(DataSource const& other); 
    virtual ~DataSource(); 

    template <typename WordType> 
    virtual void Put(
     WordType const* const data, 
     unsigned int const wordCount) = 0; 
} 

और यह कि सभी प्रकार के संभावित प्रकारों के संदर्भ में वर्चुअल टेबल के प्रबंधन की अक्षमता के कारण इस विधि को तत्काल किया जाएगा।

हालांकि, जब यह टेम्पलेट वर्ग के वर्चुअल सदस्य फ़ंक्शन पर आया, तो यह अलग-अलग प्रतीत होता है क्योंकि संपूर्ण वर्ग स्वयं टेम्पलेट पैरामीटर के माध्यम से "बनाया गया" होता है जब टेम्पलेट क्लास चर को instanciated किया जाता है। इस बिंदु पर, वर्चुअल विधि टेम्पलेट्स की "खोज-और-प्रतिस्थापन" प्रकृति के कारण कक्षा के किसी भी अन्य वायरल विधि की तरह ही है।

वैसे भी, प्रश्न में फिर से खोने के मामले में सवाल बताते हुए: आभासी (शुद्ध और/या सामान्य) आभासी कार्यों को एक टेम्पेट कक्षा में अनुमति दी जाती है?

+5

ऐसा लगता है कि आप पहले से ही इस का जवाब खोज निकाला है की तरह ... –

+3

जैसा कि मैंने कहा, मैं अपने आप को कसम कि मैं इसे पहले की कोशिश की और मुद्दों था। जब यह अचानक काम करता था, मैं यह सुनिश्चित करना चाहता था कि यह सिर्फ इसलिए नहीं था क्योंकि मैं एक अलग कंपाइलर, विभिन्न चेतावनी/त्रुटि झंडे आदि पर था और यह परिभाषित किया गया था - अधिमानतः - यह मानक द्वारा ठीक था। – Anthony

+2

इसके अलावा, इसके लायक होने के लिए, मुझे कुछ भी ऑनलाइन नहीं मिला जो निश्चित रूप से एक या दूसरे तरीके से कहा जाता है। एसओ से इस जानकारी को रखने के लिए बेहतर जगह क्या है? – Anthony

उत्तर

44

एक कक्षा टेम्पलेट में वास्तव में आभासी या शुद्ध वर्चुअल फ़ंक्शन हो सकते हैं। टेम्पलेट्स और टाइप सूचियों का उपयोग करके आगंतुक पैटर्न को कार्यान्वित करने के लिए इसे "आधुनिक सी ++ डिजाइन" में आंद्रेई अलेक्जेंड्रेसू द्वारा नियोजित किया गया था। यदि आप रुचि रखते हैं तो आप कोड here in his Loki library देख सकते हैं।

अधिकांश मानक सी ++ कार्यान्वयन के साथ, यह ठीक है, क्योंकि जब टेम्पलेट को तुरंत चालू किया जाता है तो वर्चुअल फ़ंक्शन एक एकल कार्य होता है। नतीजतन, vtable में आवश्यक स्लॉट की संख्या अनुवाद इकाई के भीतर जाना जा सकता है, इसलिए एक vtable उत्पन्न किया जा सकता है।

जैसा कि आपने बताया है, आपके पास वर्चुअल टेम्पलेट सदस्य फ़ंक्शन नहीं हो सकता है क्योंकि Vtable स्लॉट की संख्या अनुवाद इकाई के भीतर नहीं जानी जाएगी।

आशा है कि इससे मदद मिलती है!

6

आभासी (शुद्ध और/या सामान्य) आभासी एक tempate वर्ग के भीतर अनुमति कार्यों हैं?

हां। पूरी तरह से कानूनी।

6

इस बारे में सोचें कि एक टेम्प्लेट क्लास क्या है - यह कक्षा नहीं है, लेकिन एक टेम्पलेट संकलक कक्षा बनाने के लिए उपयोग कर सकता है।

इस प्रकार, कोई कारण नहीं है कि आप टेम्पलेट क्लास परिभाषा में वर्चुअल फ़ंक्शन (शुद्ध या अन्यथा) शामिल नहीं कर सकते हैं, क्योंकि वर्चुअल टेबल समेत कोई भी कोड उत्पन्न नहीं करता है।

जब हम वास्तव में टेम्पलेट वर्ग को तुरंत चालू करते हैं, उदा। DataSource<int>, तो संकलक को केवल उस चयनित प्रकार के लिए वर्चुअल तालिका बनाने की आवश्यकता होती है, इसलिए यह एक गैर-टेम्पलेट श्रेणी के लिए (शुद्ध या अन्यथा) वर्चुअल फ़ंक्शन से अलग नहीं है।

1

वर्चुअल फ़ंक्शंस वाला क्लास टेम्पलेट बिल्कुल ठीक है। लेकिन, कक्षा या टेम्पलेट वर्ग में वर्चुअल वर्चुअल कीवर्ड वाले टेम्पलेट फ़ंक्शंस की अनुमति नहीं है।नीचे में मदद मिलेगी आपको लगता है कि मिल:

//This is perfectly fine. 
template <type T> 
class myClass{ 
    virtual void function() = 0; 
}; 

//This is NOT OK... 
template<type T> 
class myClass{ 
     template <type T> 
     virtual void function() = 0; 
}; 
संबंधित मुद्दे