2011-07-05 5 views
7

मैं अपने अधिकांश वर्गों को दो कार्यों के साथ क्रमबद्ध करता हूं, पढ़ता हूं() और लिखता हूं()। मैं क्या करना चाहता हूं, उप-वर्गों से बुलाए गए बेस क्लास के पढ़ने/लिखने() फ़ंक्शन को इतना है कि मुझे क्रमशः कोड को कई बार दोहराना नहीं है।सी ++ में ओवरराइड होने के बाद मूल फ़ंक्शन को कैसे कॉल करें?

उदाहरण के लिए:

class Base 
{ 
public: 
    base(); 
    virtual read(QDataStream&); 
    virtual write(QDataStream&); 
private: 
    int a, b, c, d; 
} 

class Sub : public Base 
{ 
public: 
    Sub(); 
    read(QDataStream&); 
    write(QDataStream&); 
private: 
    int e, f, g, h; 
} 

तो इस उदाहरण में, मैं पढ़ने/लिखने ए, बी, सी, डी बेस से आने के लिए कोड चाहते हैं। उप तब बेस :: पढ़ा जाएगा (QDataStream &) और उसके बाद उप-गुण जो भी विशेष हैं, जोड़ दें। इस तरह मुझे प्रत्येक उपclass (और संभवतः ऐसा करने के लिए भूल जाते हैं) के लिए serialization कोड दोहराना नहीं है।

+6

ध्यान दें कि यह वास्तव में एक विधि कहा जाता है "अधिभावी":

आप माता-पिता वर्ग संस्करण का उपयोग जब आप एक उपवर्ग में हैं गुंजाइश हल कर सकते हैं और। "अधिभार" तब होता है जब आपके पास कई विधियां होती हैं जिनका नाम समान होता है लेकिन जो विभिन्न प्रकार के तर्क लेते हैं। उदाहरण के लिए, तारों को शामिल करते समय + ऑपरेटर अर्थ देने के लिए एक स्ट्रिंग क्लास ऑपरेटर +() को ओवरलोड कर सकता है। – Caleb

+0

आपको उदाहरणों को सही बनाने की कोशिश करनी चाहिए। सदस्य फ़ंक्शंस में रिटर्न प्रकार गुम हैं, इस प्रकार को 'बेस' कहा जाता है, लेकिन वहां 'बेस' कन्स्ट्रक्टर लगता है ... –

+0

स्पेलिकेशन कैलेब के लिए धन्यवाद। – jecjackal

उत्तर

17

आप आधार स्तरीय पहचानकर्ता के साथ समारोह कॉल, गुंजाइश ऑपरेटर (के बाद prepending द्वारा आधार स्तरीय कार्यों कॉल कर सकते हैं: :)।

इस तरह

:

class Base 
{ 
public: 
    virtual void Function(); 
} 

class Foo : public Base 
{ 
public: 
    void Function(); 
    void DoSomething(); 
} 

void Foo::DoSomething() 
{ 
    Base::Function(); // Will call the base class' version of Function(). 
    Function();   // Will call Foo's version of Function(). 
} 

संपादित करें: ध्यान दें अनुरोध पर निकाला गया।

+5

कृपया, पूरे * अतिरिक्त नोट * को हटाएं, यह पूरी तरह से ऑफ-विषय है, और बदतर: गलत। प्रारंभकर्ता सूची और योग्य सदस्य फ़ंक्शन कॉल पूरी तरह से असंबंधित हैं। उनके पास समान वाक्यविन्यास भी नहीं है, आम बात यह है कि आधार प्रकार का नाम कोड में कहीं भी दिखाई देता है। –

+0

पूरी तरह से स्पष्टीकरण के लिए धन्यवाद – jecjackal

+0

@ डेविड: मैं यह इंगित करना चाहता हूं कि नोट में कोड संकलित होगा और जो मैंने समझाया है वह करता है। हालांकि मैंने इसे हटा दिया, क्योंकि मैं मानता हूं कि यह ऑफटॉपिक था (जैसा कि मैंने जवाब में उल्लेख किया है)। मैं इस धारणा के तहत था कि संबंधित जानकारी (हालांकि पूरी तरह से नहीं) अतिरिक्त जानकारी प्रदान करने का प्रयास करने में कोई हानि नहीं थी, अगर मैंने स्पष्ट रूप से उस पद के बिंदु का उल्लेख किया जहां सटीक उत्तर समाप्त हुआ और अतिरिक्त जानकारी शुरू हुई (जैसा मामला था) । – Rycul

9
void Sub::read(QDataStream &stream) 
{ 
    Base::read(stream); 
    // do Sub stuff here 
} 
6

सबसे पहले - आपके सदस्य कार्यों में वापसी प्रकार नहीं हैं - सी ++ में मान्य नहीं है, आपका कंपाइलर 'डिफ़ॉल्ट int' व्यवहार के बारे में शिकायत कर सकता है और इसे पास करने देता है, लेकिन आपको उन्हें रिटर्न प्रकार देना चाहिए (मैं void का उपयोग करूंगा प्लेसहोल्डर के रूप में)।

void Sub::read(QDataStream& qds) { 
    Base::read(qds); 

    // do more stuff 
} 
+0

यह बहुत अच्छा काम करता है, धन्यवाद – jecjackal

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