2010-06-04 18 views
16

क्यों सी ++ संकलक इस त्रुटि देता है? मैं बी से lol() तक क्यों पहुंच सकता हूं, लेकिन rofl() [पैरामीटर के बिना] तक नहीं पहुंच सकता। पकड़ कहाँ है?विरासत और विधि अधिभार

class A 
{ 
public: 
    void lol(void) {} 
    void rofl(void) { return rofl(0);} 
    virtual void rofl(int x) {} 
}; 

class B : public A 
{ 
public: 
    virtual void rofl(int x) {} 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    A a; 
    a.lol(); 
    a.rofl(1); 
    a.rofl(); 

    B b; 
    b.lol(); 
    b.rofl(1);  
    b.rofl(); //ERROR -> B::rofl function does not take 0 arguments 


    return 0; 
} 

उत्तर

29

B::rofl(int) 'खाल' A::rofl()A के rofl ओवरलोड होने के लिए, आपको घोषित करना चाहिए using A::rofl;

class B : public A { 
public: 
    using A::rofl; 
    ... 
}; 

यह सी के ++ एक बुद्धिमान कदम है: यह आपको चेतावनी देता है कि आप शायद भी B में A::rofl() विधि ओवरराइड करने के लिए की जरूरत है। या तो आप ऐसा करते हैं, या आप स्पष्ट रूप से घोषणा करते हैं कि आप A के अन्य अधिभार का उपयोग करते हैं।

+0

+1 मुझसे अधिक तेज़ :) – AraK

+0

हाँ, लेकिन ए :: rofl() वर्चुअल नहीं है। विचार है - rofl() allways वर्चुअल rofl (0) कहते हैं। –

+0

@ 0xDEAD BEEF: उस स्थिति में, आप इसका उपयोग करने के लिए _intend_ का उपयोग करते हैं, इसलिए 'ए :: आरओएफएल का उपयोग करके' कंपाइलर को यह स्पष्ट करें। – xtofl

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