2012-03-13 13 views
7

बुला मैं इस तरह की कक्षाओं का एक सेट है: हर वर्ग है, जिसमेंसी ++ मैन्युअल रूप से परहेज आधार वर्ग समारोह

if (A::Doit() == 1) { return 1; } else { 

:

class A { 
public: 
    int DoIt() { 
    //common code 
    } 
}; 

class B : public A { 
    int DoIt() { 
    if (A::DoIt() == 1) { 
     return 1; 
    } 
    else { 
     // do b specific code 
    } 
    } 
}; 

class C : public A { 
    int DoIt() { 
    if(A::DoIt()==1) { 
     return 1; 
    } 
    else { 
     // do c specific code 
    } 
    } 
}; 

वहाँ एक रास्ता मैं मैन्युअल रूप से इस कोड को डालने से बच सकते हैं है ए से व्युत्पन्न?

+1

सही वाक्यविन्यास 'वर्ग बी: सार्वजनिक ए' है। सी ++ जावा नहीं है। – kennytm

+0

@ जस्टिन ᚅᚔᚈᚄᚒᚔ: ओपी पूछ रहा है कि टाइपिंग से बचने के लिए कैसे करें 'अगर (ए :: डोइट() == 1) वापसी 1; } else {'प्रत्येक उप-वर्ग में, ए को जानने के बिना 'ए :: डोइट()' को कॉल करने के लिए नहीं। लिंक किया गया प्रश्न विरासत से भी संबंधित नहीं है। – kennytm

उत्तर

9

बस विशिष्ट कोड को अन्य विधि वर्चुअल विधि से अलग करें।

class A 
{ 
public: 
    int DoIt() /*final*/ 
    { 
     // common code 
     if (return_value == 1) 
      return 1; 
     else 
      return DoIt_specific(); 
    } 

private: 
    virtual int DoIt_specific() = 0; 
    //^or some "A"-specific actions if A cannot be abstract. 
}; 

class B : public A 
{ 
    virtual int DoIt_specific() /*override*/ 
    { 
     // specific code for B 
    } 
}; 

इसे non-virtual interface मुहावरे के रूप में जाना जाता है।

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