2012-06-06 10 views
15

मैं एक बेस क्लास रखना चाहता हूं जिसमें निरंतर फ़ील्ड हो (जैसे क्लास से जुड़ी एक अद्वितीय आईडी जिसे संकलन समय के बाद संशोधित नहीं किया जा सकता)। अब तक static const घोषणा ठीक होगी। अब, मैं इस बेस क्लास का उत्तराधिकारी बनना चाहता हूं और यह सुनिश्चित करना चाहता हूं कि इस वर्ग के बच्चों के पास एक ही क्षेत्र है, लेकिन उनके अपने मूल्यों के साथ। मैं यह कैसे कर सकता हूँ?क्या सी ++ कक्षा में वर्चुअल स्थिर स्थिर मान घोषित करना संभव है?

मान लीजिए, मैं एक ID क्षेत्र है कि 0. की int मूल्य तो रखती है साथ Base नामक एक आधार वर्ग करना चाहते हैं, मैं वर्गों A, B और C करना चाहते हैं, उन सभी को किया जा रहा है Base के सार्वजनिक बच्चे और मैं यह सुनिश्चित करना चाहता हूं कि इन बच्चों के पास ID फ़ील्ड्स भी 1, 2 और 3 के संबंधित मानों के साथ होंगे ('सुनिश्चित करने के द्वारा', मेरा मतलब है कि एक कंपाइलर त्रुटि प्राप्त करने की तरह कुछ अगर वे ' एक आईडी स्पष्ट रूप से घोषित किया गया है)।

मैं इस परिदृश्य के निर्माण के लिए प्रबंधन कर सकते हैं, तो मेरी उम्मीद से हो सकता है कि एक Base* सूचक की ID क्षेत्र के लिए पूछ रहा है, मैं निर्भर करता है कि सूचक के रूप में new A(), new B() या new C() बनाया गया था विभिन्न मूल्यों मिलना चाहिए।

मेरा अनुमान IDvirtual static const के रूप में घोषित करना होगा, जो निश्चित रूप से समझ में नहीं आता है और एक कंपाइलर त्रुटि देता है।

लेकिन फिर वर्णित परिणाम प्राप्त करने के लिए मैं क्या कर सकता हूं? (केवल एक चीज जिसे मैं कल्पना कर सकता हूं ID को एक पूर्णांक लौटने वाले वर्चुअल फ़ंक्शन के रूप में घोषित करना होगा और फिर फ़ंक्शन बॉडी में मूल्य को हार्ड-कोड करना होगा, लेकिन मैं कुछ और सुरुचिपूर्ण दिख रहा हूं।)

धन्यवाद अग्रिम!

+0

बहुरूपता सदस्य कार्यों के लिए ही काम करता है और डेटा के सदस्यों के लिए मान्य नहीं है। – Mahesh

+0

मैंने टेम्पलेट्स पर आधारित एक विकल्प लिखा है: http://stackoverflow.com/a/36797199/1529139 – 56ka

उत्तर

15

static विधि virtual नहीं हो सकती है, और कोई डेटा सदस्य virtual नहीं हो सकता है।

लेकिन आप व्युत्पन्न कक्षाओं में static फ़ील्ड छुपा सकते हैं और उन्हें वापस करने के लिए virtual विधि का उपयोग कर सकते हैं।

class A 
{ 
public: 
    static const int ID = 0; 
    virtual int getID() { return A::ID; } 
}; 
class B : A 
{ 
public: 
    static const int ID = 1; 
    virtual int getID() { return B::ID; } 
}; 

वैकल्पिक:

class A 
{ 
public: 
    A(int id = 0) : ID(id) {} 
    const int ID; 
    getID() { return ID; } 
}; 
class B : public A 
{ 
public: 
    B() : A(1) {} 
}; 
+0

हां, यह एकमात्र समाधान है जिसे मैं अब तक जानता था। लेकिन क्या इसे और अधिक सुरुचिपूर्ण/सरल तरीके से हल करने का कोई तरीका नहीं है? या यदि यह जाने का एकमात्र तरीका है, तो मेरा प्रश्न है: क्यों कारण है कि वर्चुअल विरासत जो कार्यों के साथ काम करती है, डेटा सदस्यों के साथ काम नहीं करेगी? मैं समझता हूं कि वास्तव में क्यों 'स्थैतिक आभासी' समझ में नहीं आता है, लेकिन मैं वास्तव में समझ नहीं पा रहा हूं कि क्यों, मान लें कि एक सरल 'आभासी आधार int' फ़ील्ड समझ में नहीं आता है ... –

+0

@ सिस्काडाम क्योंकि बहुलक व्यवहार नहीं है डेटा सदस्यों के लिए परिभाषित किया गया। जिस तरह से भाषा डिजाइन की गई है। और यह आईएमओ की अच्छी बात है। –

+0

@ सिस्काडाम मैंने एक विकल्प पोस्ट किया, लेकिन मुझे अभी भी पहला सबसे अच्छा लगता है। –

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