मैं यहां सी ++ में एक बिंदु को समझने की कोशिश कर रहा हूं। यदि कक्षा ए में गैर-वर्चुअल विधि है, और कक्षा बी, जो ए को बढ़ाता है, उस विधि को ओवरराइड करता है, क्या मैं बी का उदाहरण बना सकता हूं और किसी भी तरह बी में परिभाषित विधि का उपयोग कर सकता हूं? क्या गैर-वर्चुअल विधि को ओवरराइड करने का कोई बिंदु है?क्या मैं एक गैर वर्चुअल विधि ओवरराइड करने वाली विधि का उपयोग कर सकता हूं?
उत्तर
क्या एक गैर-वर्चुअल विधि को ओवरराइड करने का कोई बिंदु है?
आप वास्तव में अधिभावी नहीं हैं, लेकिन इस व्यवहार है, यानी
B* b = new B();
A* a = new B();
b->method(); //Calls B's method
a->method(); // Calls A's method
तो, सूचक/संदर्भ प्रकार विधि कहा जाता है निर्धारित करता है।
क्या मैं बी का उदाहरण बना सकता हूं और किसी भी तरह बी में परिभाषित विधि का उपयोग कर सकता हूं?
हां। सूचक/संदर्भ प्रकार बी प्रकार का होना चाहिए (पिछले उदाहरण देखें)।
आप method
घोषित नहीं करते virtual
होने के लिए आपको ओवरराइड यह नहीं कर सकते हैं, लेकिन आप छिपाने यह कर सकते हैं।
ग्रेट उत्तर, धन्यवाद – Eyal
एक "गॉचा" स्थिति है जब 'ए' बदले में कुछ बेस क्लास (या एक इंटरफ़ेस लागू करता है) से प्राप्त होता है जो' आभासी विधि() 'घोषित करता है, जिसमें 'a-> विधि() 'वास्तव में' बीएम विधि() 'कॉल करेगा ... – BadCash
@Chip आप अंतर पर जोर देने के लिए चूक गए। यह उत्तर केवल BadCashs टिप्पणी के साथ पूरा हो गया है। – ManuelSchneid3r
A
से B
इनहेरिट करती है, और एक विधि A
में परिभाषित पुनर्परिभाषित करता है, तो B
के नए उदाहरणों B
के संस्करण कॉल करेंगे। हालांकि, यदि विधि वर्चुअल नहीं है, तो कोई बहुलक व्यवहार नहीं है, इसलिए B
का उदाहरण A
के रूप में संदर्भित किया गया है, तो विधि A
होगी। उदाहरण के लिए:
struct A {
void foo() { std::cout << "A::foo" << std::endl; }
};
struct B : public A {
void foo() { std::cout << "B::foo" << std::endl; }
};
B b;
b.foo();
A *a = &b;
a->foo();
कोड के उत्पादन में ऊपर होगा:
B::foo
A::foo
हालांकि, अगर foo
विधि आभासी किया गया था, तो B::foo
हैं दो बार मुद्रित किया गया है।
अच्छी तरह से लिखा गया है! :) – niknak
एक समारोह virtual
नहीं है तो चर का प्रकार निर्धारित करता है जो कार्यान्वयन भी भेजा जाता है:
#include <iostream>
using namespace std;
struct A {
void f() { cout << "A" << endl; }
};
struct B : public A {
void f() { cout << "B" << endl; }
};
int main(int args, char** argv) {
B b;
A& a = b;
b.f();
a.f();
return 0;
}
- नहीं, वर्ग ए में एक गैर आभासी विधि ओवरराइड करने के लिए कोई तंत्र है
- हाँ, आप गुंजाइश संकल्प ऑपरेटर एक का उपयोग करके कक्षा एक से एक गैर आभासी विधि बी में अतिभारित उपयोग कर सकते हैं :: methodName
- 1. मैं ओवरराइड वर्चुअल फ़ंक्शंस में 'विरासत' पूर्वजों विधि का उपयोग कैसे कर सकता हूं?
- 2. क्या गैर-वर्चुअल विधि को ओवरराइड करना संभव है?
- 3. क्या मैं एक छिपी हुई (लेकिन सार्वजनिक) विधि को ओवरराइड कर सकता हूं और इसकी सुपर विधि कह सकता हूं?
- 4. मैं एक ओवरराइड वर्चुअल विधि के 'आधार कार्यान्वयन' को कैसे कॉल कर सकता हूं?
- 5. वर्चुअल विधि
- 6. सी ++ आभासी विधि ओवरराइड
- 7. क्या मैं वंचित वर्चुअल विधि को सबक्लास में ओवरराइड होने से रोक सकता हूं?
- 8. वर्चुअल विधि को ओवरलोड करने से गैर-वर्चुअल विधि से भिन्न होता है?
- 9. क्यों मेरी वर्चुअल विधि ओवरराइड नहीं है?
- 10. सी ++: विरासत ओवरलोडेड गैर वर्चुअल विधि और वर्चुअल विधि दोनों एक ही नाम के साथ समस्या का कारण बनती है
- 11. क्या मैं विधि में कोड का निरीक्षण करने के लिए प्रतिबिंब का उपयोग कर सकता हूं?
- 12. मैं रूबी में क्लास विधि और इंस्टेंस विधि का उपयोग कैसे कर सकता हूं?
- 13. क्या 'ओवरराइड' कीवर्ड सिर्फ ओवरराइड वर्चुअल विधि के लिए एक चेक है?
- 14. मैं एक PHP कर्ल अनुरोध के साथ एक्स-HTTP-विधि-ओवरराइड का उपयोग कर एक पोस्ट कैसे बना सकता हूं?
- 15. मैं django मॉडल में विधि कैसे प्राप्त कर सकता हूं?
- 16. क्या मैं subclasses को सार बनाने के बिना किसी विधि को ओवरराइड करने के लिए मजबूर कर सकता हूं?
- 17. मैं एक संपत्ति सेटर को कैसे ओवरराइड कर सकता हूं?
- 18. मैं इस एसिंक्रोनस विधि का नकल कैसे कर सकता हूं?
- 19. एक गैर async विधि
- 20. क्या मैं संकलक को एक विशिष्ट विधि को अनुकूलित करने के लिए मजबूर कर सकता हूं?
- 21. स्थैतिक चर का उपयोग करने वाली कॉन्स विधि
- 22. क्या मैं log4j का उपयोग कर जावा विधि के भीतर लॉगिंग स्तर सेट कर सकता हूं?
- 23. जावा वर्चुअल विधि आमंत्रण का उपयोग क्या है?
- 24. मैं अपनी httpPost विधि का परीक्षण कहां कर सकता हूं?
- 25. मैं किसी विधि का संदर्भ कैसे प्राप्त कर सकता हूं?
- 26. सी ++ संकलन के दौरान 'वर्चुअल विधि ... लेकिन गैर-वर्चुअल विनाशक' चेतावनी का क्या अर्थ है?
- 27. अनुरोध हेडर की जांच करने वाली विधि का परीक्षण करने के लिए मैं यूनिट परीक्षण कैसे कर सकता हूं?
- 28. मैं एक कॉन्स्ट विधि से गैर-कॉन्स्ट सदस्य फ़ंक्शन पॉइंटर क्यों कॉल कर सकता हूं?
- 29. मैं सी # में प्रतिबिंब द्वारा प्राप्त विधि को एक विधि के रूप में स्वीकार करने वाली विधि को कैसे पास कर सकता हूं?
- 30. क्या मैं रुबी में एक विधि उपनाम हटा सकता हूं?
जो आप वर्णन करते हैं उसे * छुपाएं * कहा जाता है, ओवरराइड नहीं किया जाता है। यहां एक नज़र डालें, उदाहरण के लिए: http://stackoverflow.com/questions/2161462/c-inheritance-and-function-overriding – jrok