2012-04-02 14 views
20

मैं एक cpp में एक घोषणा की है जहां एक समारोह की तरह है:वर्चुअल शून्य funcFoo() const = 0 और वर्चुअल शून्य funcFoo() = 0 के बीच अंतर;

virtual void funcFoo() const = 0; 

मैं, मान लेते हैं कि किसी अन्य वर्ग द्वारा विरासत में मिला जा सकता है अगर स्पष्ट घोषित किया जाता है लेकिन क्या बीच

virtual void funcFoo() = 0; 

महत्वपूर्ण है अंतर है मेरे प्रोग्रामिंग में सुधार करने के लिए और मैं अंतर जानना चाहता हूं। मैं एक बुरा उत्तराधिकारी के कारण एक खराबी नहीं चाहता।

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

+2

http://stackoverflow.com/questions/ 751681/अर्थ-ऑफ-कॉन्स-एंड-इन-एसी-विधि-घोषणा – vid

+4

संक्षिप्त उत्तर: 'const' correctness। – iammilind

उत्तर

31

पहला हस्ताक्षर का अर्थ है कि विधि को व्युत्पन्न प्रकार के कॉन्स्ट इंस्टेंस पर कॉल किया जा सकता है। दूसरे संस्करण को कॉन्स इंस्टेंस पर नहीं कहा जा सकता है। वे अलग-अलग हस्ताक्षर हैं, इसलिए दूसरे को लागू करके, आप पहले संस्करण को लागू या ओवरराइड नहीं कर रहे हैं।

struct Base { 
    virtual void foo() const = 0; 
}; 

struct Derived : Base { 
    void foo() { ... } // does NOT implement the base class' foo() method. 
}; 
+7

+1 यह उल्लेख करने के लिए कि वे एक-दूसरे को ओवरराइड नहीं करते हैं। –

+3

नहीं, यह दूसरी तरफ है: पहला फ़ंक्शन दोनों कॉन्स और गैर-कॉन्स इंस्टेंस पर कॉल किया जा सकता है, जबकि दूसरा केवल गैर-कॉन्स इंस्टेंस पर (मुझे पता है कि यह जटिल है, मुझे यह भी पहली बार गलत लगता है :-) –

+0

महान स्पष्टीकरण! – BajaBob

11

अंतर यह है कि पहला फ़ंक्शन const ऑब्जेक्ट्स पर कॉल किया जा सकता है, जबकि दूसरा नहीं कर सकता है। इसके अलावा, पहला फ़ंक्शन केवल उसी ऑब्जेक्ट पर अन्य const सदस्य फ़ंक्शंस को कॉल कर सकता है। विरासत के संबंध में, वे वही व्यवहार करते हैं।

इस विषय पर C++ FAQ भी देखें।

3

दो आभासी कार्यों में अलग-अलग हस्ताक्षर होते हैं लेकिन विरासत एक ही तरीके से काम करेगा। पूर्व एक कॉन्स विधि है और केवल कॉन्स ऑपरेशंस (विधियों) और वस्तुओं का समर्थन कर सकता है।

1

स्थिरांक तरीकों वस्तु की स्थिति को बदल नहीं सकते तो

virtual void funcFoo() const = 0; 

virtual void funcFoo() = 0; 

के अंतर जो कहा जा सकता है के साथ इस वर्ग के स्थिरांक मामलों में बुलाया जाएगा केवल निरंतर उदाहरणों में। सी ++ में कॉन्स लॉजिक के लिए Google पर आज़माएं।

एक नज़र डालें:: http://en.wikipedia.org/wiki/Const-correctness

14
virtual void funcFoo() const = 0; 
- You can't change the state of the object 
- You can call this function via const objects 
- You can only call another const member functions on this object 

virtual void funcFoo() = 0; 
- You can change the state of the object 
- You can't call this function via const objects 

सबसे अच्छा ट्यूटोरियल या सामान्य प्रश्न मैं स्थिरांक correctectness के बारे में देखा है parashift द्वारा सी ++ पूछे जाने वाले प्रश्न था http://www.parashift.com/c++-faq-lite/const-correctness.html

+0

यह सबसे अच्छा जवाब है। एकमात्र चीज जो मैं गड़बड़ कर रहा हूं वह समझ रहा है कि 'कॉन्स्ट' ऑब्जेक्ट क्या है .. –

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