2012-03-18 24 views
38

संभव डुप्लिकेट:
Preferred way to simulate interfaces in C++सी ++ में इंटरफेस को कैसे कार्यान्वित करें?

मैं पता लगाने के लिए अगर वहाँ सी में इंटरफ़ेस हैं उत्सुक था ++ जावा में क्योंकि, वहाँ ज्यादातर के माध्यम से कक्षाएं decoupling साथ डिजाइन पैटर्न के कार्यान्वयन है इंटरफेस। क्या सी ++ में इंटरफ़ेस बनाने का कोई समान तरीका है?

उत्तर

65

सी ++ में इंटरफेस की कोई अंतर्निहित अवधारणा नहीं है। आप इसे abstract classes का उपयोग करके कार्यान्वित कर सकते हैं जिसमें केवल pure virtual functions शामिल है। चूंकि यह एकाधिक विरासत की अनुमति देता है, इसलिए आप इस वर्ग को एक और कक्षा बनाने के लिए उत्तराधिकारी बना सकते हैं जिसमें इसमें इस इंटरफ़ेस (मेरा मतलब है, ऑब्जेक्ट इंटरफ़ेस :-)) होगा।

एक नमूना उदाहरण कुछ इस तरह हो सकता है -

class Interface 
{ 
public: 
    Interface(){} 
    virtual ~Interface(){} 
    virtual void method1()=0; // "=0" part makes this method pure virtual, and 
           // also makes this class abstract. 
    virtual void method2()=0; 
}; 

class Concrete : public Interface 
{ 
private: 
    int myMember; 

public: 
    Concrete(){} 
    ~Concrete(){} 
    void method1(); 
    void method2(); 
}; 

// Provide implementation for the first method 
void Concrete::method1() 
{ 
    // Your implementation 
} 

// Provide implementation for the second method 
void Concrete::method2() 
{ 
    // Your implementation 
} 

int main(void) 
{ 
    Interface *f = new Concrete(); 

    f->method1(); 
    f->method2(); 

    delete f; 

    return 0; 
} 
+6

आपके उदाहरण में _undefined व्यवहार_ है क्योंकि इंटरफ़ेस में वर्चुअल विनाशक नहीं है। –

+0

@ चार्ल्सबीली: क्षमा करें, इसका उल्लेख करना भूल गया। इसे पकड़ने के लिए धन्यवाद! क्या अब यह ठीक है? –

+2

... हालांकि आपका उदाहरण संकलित नहीं होना चाहिए क्योंकि आप कंक्रीट :: विधि 1 और कंक्रीट :: विधि 2 को परिभाषित करते हैं लेकिन ये कंक्रीट के वैध सदस्य नहीं हैं और you.instantiate कंक्रीट हालांकि यह अभी भी सार है। –

12

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

7

इंटरफेस सी ++ में शुद्ध अमूर्त वर्ग के अलावा कुछ भी नहीं है। आदर्श रूप से यह इंटरफ़ेसclass में केवल शुद्ध virtual सार्वजनिक विधियों और static const डेटा होना चाहिए। जैसे

class interfaceA 
{ 
public: 
    static const int X = 10; 
    virtual void foo() = 0 
    virtual int get() const = 0; 
    virtual inline ~interfaceA() = 0; 
}; 
interfaceA::~interfaceA() {} 
+1

आभासी विनाशक के बारे में क्या? –

+0

मैं भविष्य में संभावित मेमोरी लीक से बचने के लिए वर्चुअल डॉटोर जोड़ूंगा। – barankin

+0

@ चार्ल्सबैली, याद किया। पोस्ट संपादित किया गया। कक्षा के शुद्ध 'सार' और 'इनलाइन' को बनाए रखने के लिए शुद्ध' आभासी 'के रूप में जोड़ा गया ताकि यह लिंकर त्रुटियों के बिना हेडर फ़ाइल में रह सके। – iammilind

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