2012-08-14 21 views
13

संभव डुप्लिकेट:
How do you declare an interface in C++?
Interface as in java in c++?सी ++ में जावा इंटरफेस के समतुल्य?

मैं सी सीखने ++ एक जावा प्रोग्रामर हूँ, और अगर वहाँ सी में जावा इंटरफेस ++, यानी वर्गों है कि एक और वर्ग की तरह कुछ है मैं सोच रहा था एक से अधिक से अधिक लागू/विस्तार कर सकते हैं। धन्यवाद। पी। नया यहाँ तो मुझे बताओ कि मैंने कुछ गलत किया है।

+8

सी ++ पूर्ण [एकाधिक विरासत] (http://en.wikipedia.org/wiki/Multiple_inheritance) का समर्थन करता है, इसलिए जावा में कक्षाओं और इंटरफेस के बीच कोई अंतर नहीं है। यदि आप सभी शुद्ध वर्चुअल विधियों के साथ कक्षा बनाते हैं तो यह जावा इंटरफेस के बराबर है। – DaoWen

+0

केवल शुद्ध आभासी सदस्य कार्यों के साथ एक सार वर्ग। – oldrinb

+0

वीसी ++ के '__interface' कीवर्ड पर भी विचार करें। एमएसडीएन की जांच करें। – MasterMastic

उत्तर

20

सी ++ में केवल एक शुद्ध वर्चुअल विधियों वाला एक वर्ग इंटरफ़ेस को दर्शाता है।

उदाहरण:

// Define the Serializable interface. 
class Serializable { 
    // virtual destructor is required if the object may 
    // be deleted through a pointer to Serializable 
    virtual ~Serializable() {} 

    virtual std::string serialize() const = 0; 
}; 

// Implements the Serializable interface 
class MyClass : public MyBaseClass, public virtual Serializable { 
    virtual std::string serialize() const { 
     // Implementation goes here. 
    } 
}; 
+2

जावा इंटरफ़ेस कार्यान्वयन अनुकरण करने के लिए आपको ** वर्चुअल विरासत ** की आवश्यकता है। FTFY। –

+0

@ चीयर्संधथ.-अल्फ यह सही है। फिक्स के लिए धन्यवाद। – StackedCrooked

+1

-1, यह * अमूर्त वर्ग *, नहीं * इंटरफ़ेस * है। आप इसके * इंटरफ़ेस * के माध्यम से ऑब्जेक्ट का स्वामित्व नहीं ले सकते हैं, यानी * इंटरफ़ेस * में सार्वजनिक विनाशक नहीं हो सकता है। (जब तक यह 'IDestructible' * इंटरफ़ेस * नहीं है)। – Abyx

-6

जावा interface का अनुकरण करने के लिए, आप केवल शुद्ध आभासी कार्यों के साथ एक साधारण आधार का उपयोग कर सकते हैं।

आपको वर्चुअल विरासत का उपयोग करने की आवश्यकता है, अन्यथा आप बार-बार विरासत प्राप्त कर सकते हैं: एक ही कक्षा सी ++ में एक से अधिक बार बेस क्लास हो सकती है। इसका मतलब है कि इस आधार वर्ग की पहुंच इस मामले में संदिग्ध होगी। सी ++ में, एक आभासी समारोह अधिभावी केवल आभासी समारोह घोषणा के साथ वर्ग के एक व्युत्पन्न वर्ग में किया जा सकता, जावा, एक विधि के लिए overrider में जबकि:

सी ++ नहीं जावा interface की सटीक बराबर प्रदान करता है एक बेस क्लास में interface में घोषित किया जा सकता है।

[उदाहरण:

struct B1 { 
    void foo(); 
}; 

struct B2 { 
    virtual void foo() = 0; 
}; 

struct D : B1, B2 { 
    // no declaration of foo() here 
}; 

D inherits भी समारोह घोषणाओं: B1::foo() और B2::foo()

B2::foo() शुद्ध वर्चुअल है, इसलिए D::B2::foo() भी है; B1::foo()B2::foo() ओवरराइड नहीं करता है क्योंकि B2B1 का व्युत्पन्न वर्ग नहीं है।

इस प्रकार, D एक सार श्रेणी है।

--end उदाहरण]

वैसे भी, तुम क्यों सी ++ में जावा के मनमाने ढंग से सीमा का अनुकरण करेंगे?

संपादित करें: स्पष्टीकरण के लिए जोड़ा गया उदाहरण।

+0

मैं आम तौर पर सी ++ में एकाधिक विरासत से बचने की कोशिश करता हूं, इसलिए मैंने कभी वर्चुअल विरासत में कभी नहीं देखा है। स्पष्टीकरण के लिए धन्यवाद! – DaoWen

+1

@ दाओवेन: कृपया सलाह दीजिये, यह उत्तर तकनीकी रूप से ** असंगत ** है, और पोस्टर ने इसे ठीक करने से इंकार कर दिया है। –

+1

@ चेहर और एचटी। - अल्फ: क्या आप कृपया विस्तार से बता सकते हैं कि यह गलत क्यों है? – DaoWen