2013-05-15 12 views
7

मैं सी ++ प्रोग्रामिंग के लिए नया हूं, मुझे कुछ सी ++ प्रोग्राम करते समय संदेह है, यह स्थिर सदस्य फ़ंक्शन के लिए गतिशील बाध्यकारी प्राप्त करने का तरीका है। सामान्य सदस्य कार्यों की गतिशील बाध्यकारी सदस्य कार्यों को वर्चुअल के रूप में घोषित करके हासिल की जा सकती है लेकिन हम स्थिर सदस्य कार्यों को वर्चुअल के रूप में घोषित नहीं कर सकते हैं, इसलिए कृपया मेरी सहायता करें। और कृपया नीचे उदाहरण देखें:स्थैतिक सदस्य कार्य विरासत

#include <iostream> 
#include <windows.h> 
using namespace std; 

class ClassA 
{ 
    protected : 
    int width, height; 
    public: 
    void set(int x, int y) 
    { 
     width = x, height = y; 
    } 
    static void print() 
    { 
     cout << "base class static function" << endl; 
    } 
    virtual int area() 
    { 
     return 0; 
     } 
}; 

class ClassB : public ClassA 
{ 
    public: 
    static void print() 
    { 
    cout << "derived class static function" << endl; 
    } 
    int area() 
    { 
    return (width * height); 
    } 
}; 

int main() 
{ 
    ClassA *ptr = NULL; 
    ClassB obj; 
    ptr = &obj ; 
    ptr->set(10, 20); 
    cout << ptr->area() << endl; 
    ptr->print(); 
    return 0; 
} 

ऊपर कोड मैं एक सूचक को व्युत्पन्न वर्ग वस्तु सौंपा है और स्थिर सदस्य समारोह प्रिंट (कह कर बुलाया), लेकिन यह आधार वर्ग समारोह बुला रहा है तो मैं कैसे गतिशील प्राप्त कर सकते हैं स्थिर सदस्य समारोह के लिए बाध्य करें।

उत्तर

7

गतिशील बाध्यकारी जो आप चाहते हैं वह एक गैर-स्थैतिक व्यवहार है।

गतिशीलthis सूचक के आधार पर बाध्यकारी है बंधन, और static कार्यों परिभाषा के द्वारा की जरूरत है या एक this सूचक आवश्यकता नहीं है।

मान लीजिए कि आपको अन्य परिस्थितियों में स्थिर होने के लिए फ़ंक्शन की आवश्यकता है (इसे आपके उदाहरण में स्थैतिक होने की आवश्यकता नहीं है) आप स्थैतिक फ़ंक्शन को एक गैर स्थैतिक फ़ंक्शन में लपेट सकते हैं।

class ClassA 
{ 
    // (the rest of this class is unchanged...) 

    virtual void dynamic_print() 
    { 
     ClassA::print(); 
    } 
}; 

class ClassB : public ClassA 
{ 
    // (the rest of this class is unchanged...) 

    virtual void dynamic_print() 
    { 
     ClassB::print(); 
    } 
}; 
+0

अच्छा! मुझें यह पसंद है। –

1

गतिशील बाध्यकारी बहुत अधिक समझ में नहीं आता है क्योंकि आपको स्थैतिक फ़ंक्शन को कॉल करने के लिए ऑब्जेक्ट की भी आवश्यकता नहीं है।

1

आप वर्चुअल विधियों को वर्चुअल के रूप में नहीं बना सकते हैं। बस वर्चुअल के रूप में प्रिंट विधि बनाएं (बस क्षेत्र विधि की तरह)। यह आपके उद्देश्य की सेवा करेगा।

3

तो आपके यहां दो समस्याएं हैं, पहला यह है कि आप स्थैतिक कार्यों के साथ विरासत का उपयोग नहीं कर सकते हैं। दूसरी बात यह है कि आप संकुलक को यह बताने के लिए कीवर्ड virtual खो रहे हैं कि इस कार्य को बाल कक्षाओं द्वारा ओवरराइड किया जा सकता है।

तो मान लें कि आप स्थिर समस्या को ठीक करते हैं।

virtual void print(){...} 
संबंधित मुद्दे