2013-02-18 117 views
10

मुझे सबक्लासिंग और विधियों का उपयोग करने में समस्या है।उपclass विधि क्यों नहीं कहा जाता है?

मैं कक्षा B का एक उदाहरण बनाता हूं और इसे A पर पॉइंटर के रूप में संग्रहीत करता हूं। लेकिन जब मैं ओवरलोडेड विधि को कॉल करने के लिए पॉइंटर का उपयोग करता हूं, तो आउटपुट "ए" नहीं "बी" होता है। क्यूं कर?

यह अन्य भाषाओं में काम करता है, मैं क्या गलत कर रहा हूं?

#include <iostream> 
using namespace std; 

class A { 
public: 
    void f() { 
     cout << "A"; 
    } 
}; 

class B : public A { 
public: 
    void f() { 
     cout << "B"; 
    } 
}; 

int main() { 
    A *a = new B(); 
    a->f(); 
    return 0; 
} 
+3

घोषित एक के 'च()' विधि आभासी। रनटाइम पर बिंगिंग स्थगित करने के लिए। अन्यथा –

+0

हाँ के लिए स्थैतिक बिंगिंग क्योंकि यह अच्छा स्पष्टीकरण के लिए वर्चुअल –

उत्तर

21

f() जरूरतों आधार वर्ग एक में virtual घोषित करने की:

class A { 
public: 
    virtual void f() { 
     cout << "A"; 
    } 
}; 

अन्य भाषाओं आप पहले से ही आभासी तरीकों के लिए डिफ़ॉल्ट सकता है के साथ काम किया है, लेकिन सी ++ (क्या आप डॉन के लिए भुगतान नहीं करते नहीं है उपयोग नहीं करते: वर्चुअल विधियों को कॉल करते समय एक संकेत मिलता है जिसका अर्थ है कि वे सामान्य विधि कॉल से थोड़ा धीमे होते हैं)। (dynamic binding कहा जाता है)

virtual जोड़ने, बंधन द्वारा क्रम को स्थगित कर दिया जाएगा और जो f() समारोह कॉल मूल्य की प्रकार पर निर्णय लिया जाएगा।

क्योंकि आप आभासी रूप में समारोह f() घोषित नहीं किया है, बंधन (संकलन समय) स्थिर है और चर (लेकिन मूल्य) की प्रकार का उपयोग करेगा निर्धारित करने के लिए जो f() कॉल करने के लिए। तो आपके वर्तमान कोड स्टेटमेंट में a->f();A कक्षा f() पर कॉल करता है क्योंकि aA कक्षा में सूचक है।

+2

+1 नहीं है :) – LihO

+1

@GrijeshChauhan अतिरिक्त परिशुद्धताओं के लिए धन्यवाद। – syam

6

आदेश बहुरूपी व्यवहार प्राप्त करने के लिए, आधार वर्ग की विधि virtual होना चाहिए।

तो class A में आपको void f()virtual void f() में बदलने की आवश्यकता है।

2

समारोह virtual घोषित किया जाना चाहिए इसे ओवरराइड करने में सक्षम हो:

#include <iostream> 
using namespace std; 

class A { 
public: 
    virtual void f() {// Here you must define the virtual. 
     cout << "A"; 
    } 
}; 

class B : public A { 
public: 
    virtual void f() { //Here the "virtual" is optional, but a good practice 
     cout << "B"; 
    } 
}; 

int main() { 
    A *a = new B(); 
    a->f(); 
    return 0; 
} 
+1

जब कोई सबक्लास बेस विधि में पहले से परिभाषित एक विधि के कार्यान्वयन को प्रदान करता है, तो यह [** विधि ओवरराइडिंग **] (http://en.wikipedia.org/wiki/Method_overriding) ओवरलोडिंग नहीं है। – LihO