2012-06-29 12 views
11

मैं यहां सी ++ में एक बिंदु को समझने की कोशिश कर रहा हूं। यदि कक्षा ए में गैर-वर्चुअल विधि है, और कक्षा बी, जो ए को बढ़ाता है, उस विधि को ओवरराइड करता है, क्या मैं बी का उदाहरण बना सकता हूं और किसी भी तरह बी में परिभाषित विधि का उपयोग कर सकता हूं? क्या गैर-वर्चुअल विधि को ओवरराइड करने का कोई बिंदु है?क्या मैं एक गैर वर्चुअल विधि ओवरराइड करने वाली विधि का उपयोग कर सकता हूं?

+1

जो आप वर्णन करते हैं उसे * छुपाएं * कहा जाता है, ओवरराइड नहीं किया जाता है। यहां एक नज़र डालें, उदाहरण के लिए: http://stackoverflow.com/questions/2161462/c-inheritance-and-function-overriding – jrok

उत्तर

31

क्या एक गैर-वर्चुअल विधि को ओवरराइड करने का कोई बिंदु है?

आप वास्तव में अधिभावी नहीं हैं, लेकिन इस व्यवहार है, यानी

B* b = new B(); 
A* a = new B(); 
b->method(); //Calls B's method 
a->method(); // Calls A's method 

तो, सूचक/संदर्भ प्रकार विधि कहा जाता है निर्धारित करता है।

क्या मैं बी का उदाहरण बना सकता हूं और किसी भी तरह बी में परिभाषित विधि का उपयोग कर सकता हूं?

हां। सूचक/संदर्भ प्रकार बी प्रकार का होना चाहिए (पिछले उदाहरण देखें)।

आप method घोषित नहीं करते virtual होने के लिए आपको ओवरराइड यह नहीं कर सकते हैं, लेकिन आप छिपाने यह कर सकते हैं।

+0

ग्रेट उत्तर, धन्यवाद – Eyal

+1

एक "गॉचा" स्थिति है जब 'ए' बदले में कुछ बेस क्लास (या एक इंटरफ़ेस लागू करता है) से प्राप्त होता है जो' आभासी विधि() 'घोषित करता है, जिसमें 'a-> विधि() 'वास्तव में' बीएम विधि() 'कॉल करेगा ... – BadCash

+0

@Chip आप अंतर पर जोर देने के लिए चूक गए। यह उत्तर केवल BadCashs टिप्पणी के साथ पूरा हो गया है। – ManuelSchneid3r

9

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 हैं दो बार मुद्रित किया गया है।

+0

अच्छी तरह से लिखा गया है! :) – niknak

2

एक समारोह 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; 
} 
0
  • नहीं, वर्ग ए
  • में एक गैर आभासी विधि ओवरराइड करने के लिए कोई तंत्र है
  • हाँ, आप गुंजाइश संकल्प ऑपरेटर एक का उपयोग करके कक्षा एक से एक गैर आभासी विधि बी में अतिभारित उपयोग कर सकते हैं :: methodName
संबंधित मुद्दे

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