2011-04-10 11 views
8

निम्नलिखित सरल मामले मान लें करने के लिए विरासत में मिला हैसी ++: "आभासी" सभी सन्तान

class A { 
    virtual void func(); 
}; 

class B : public A { 
    void func(); 
}; 

class C : public B { 
    void func(); 
}; 

(आभासी के स्थान नोटिस) चाहेंगे निम्नलिखित कॉल B::func() या C::func()?

B* ptr_b = new C(); 
ptr_b->func(); 
+2

हाँ, आभासी बनाता है के रूप में एक विधि की घोषणा अपने सभी सन्तान आभासी – knittl

उत्तर

6

संकेत का उपयोग कर संदर्भ के रूप में रूप में अच्छी तरह के उदाहरण।

  • सूचक

    B *pB = new C(); 
    pB->func(); //calls C::func() 
    
    A *pA = new C(); 
    pA->func(); //calls C::func() 
    
  • का उपयोग संदर्भ का उपयोग करना। अंतिम कॉल पर ध्यान दें: सबसे महत्वपूर्ण कॉल।

    C c; 
    B & b = c; 
    b.func(); //calls C::func() 
    
    //IMPORTANT - using reference! 
    A & a = b; 
    a.func(); //calls C::func(), not B::func() 
    

ऑनलाइन डेमो: http://ideone.com/fdpU7

7
  1. आपका कोड अमान्य C++ है। कक्षा परिभाषा में कोष्ठक क्या हैं?
  2. यह उद्देश्य यह है कि pointer_to_b_type द्वारा की ओर इशारा किया है गतिशील प्रकार पर निर्भर करता है।
  3. तो मैं समझता हूँ कि क्या तुम सच में पूछने के लिए है, तो 'हाँ' चाहते । यह C::func कॉल:

    C c; 
    B* p = &c; 
    p->func(); 
    
+0

@Amir: वह पूछ रहा है हां/नहीं प्रश्न। – Nawaz

+0

@Amir: वर्चुअल "सभी सन्तान को विरासत में मिला है" "है" एक हाँ/नहीं मेरे लिए सवाल की तरह लगता है। – Xeo

+0

@ एमीर: वास्तव में? मैं हमेशा सोचा है कि फार्म के सवालों के "है ..." और "चाहेंगे ..." yes/no सवाल कर रहे हैं। – ybungalobill

3

यह वर्ग है कि आप की बात कर रहे हैं में समारोह कहता है। हालांकि, यह अस्तित्व में नहीं है, हालांकि यह अस्तित्व में नहीं है।

निम्नलिखित कोड का प्रयास करें:

#include <iostream> 
using namespace std; 

class A { 
    public: 
    virtual void func() { cout << "Hi from A!" << endl; } 
}; 

class B : public A { 
    public: 
    void func() { cout << "Hi from B!" << endl; } 
}; 

class C : public B { 
    public: 
    void func() { cout << "Hi from C!" << endl; } 
}; 

int main() { 
    B* b_object = new C; 
    b_object->func(); 
    return 0; 
} 

आशा इस मदद करता है

+0

क्षमा याचना - मैं पूरी तरह से याद किया अपनी पोस्ट में कि। संशोधित। मेरा जवाब अभी भी खड़ा है;) –

+0

हां, अब यह ठीक है। – Xeo

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