2013-01-18 38 views
8

मैं एक ऐसा फ़ंक्शन बनाने के लिए std :: bind() का उपयोग करने का प्रयास कर रहा हूं जो व्युत्पन्न वर्ग के संस्करण को कॉल करने के बजाय वर्चुअल फ़ंक्शन के बेस क्लास संस्करण को कॉल करेगा।वर्चुअल फ़ंक्शन के बेस क्लास के संस्करण को कॉल करने के लिए मैं std :: bind() का उपयोग कैसे करूं?

struct Base 
{ 
    virtual void foo() { cout << "Base\n"; } 
}; 

struct Derived : public Base 
{ 
    virtual void foo() { cout << "Derived\n"; } 
}; 

int main(int argc, const char * argv[]) 
{ 
    Base* base = new Derived; 
    auto baseMethodHopefully = std::bind(&Base::foo, base); 
    baseMethodHopefully(); // Want call to Base::foo(), but get call to Derived::foo(). 

    return 0; 
} 

मैं elsewhere कि आप सामान्य रूप से इस जैसे एक "विरोधी आभासी" रास्ते में एक आधार फ़ंक्शन को कॉल नहीं कर सकता से समझते हैं।

void Derived::bar() { Base::bar(); } 

के बाद से अभिव्यक्ति Base::bar() के रूप में "विरोधी आभासी" व्युत्पन्न के तरीकों के भीतर (भावना मैं कर रहा हूँ की ओर इशारा करते में), यह में Base::bar() करने के लिए बाध्य किया जा सकता है मान्यता प्राप्त है: स्पष्ट अपवाद आम प्रतिमान है से वांछित तरीके व्युत्पन्न विधियों में से एक के भीतर? जैसे की तरह कुछ:

void Derived::bar() 
{ 
    auto baseMethod = std::bind(&Base::foo, this); 
    baseMethod(); 
} 

यदि हां, तो क्या वाक्य रचना है?

उत्तर

14

अच्छा, &Base::foo एक सदस्य फ़ंक्शन पॉइंटर है। और सदस्य फ़ंक्शन पॉइंटर का उपयोग करने का कोई तरीका नहीं है जो वर्चुअल ओवरराइड का आह्वान नहीं करता है। वर्चुअल ओवरराइड से बचने वाला एकमात्र सिंटैक्स वह है जहां कक्षा का नाम, फ़ंक्शन नाम और तर्क सूची सभी एक ही अभिव्यक्ति में हैं।

लेकिन अगर आप std::bind है, आप की संभावना भी lambdas है, तो हो सकता है आप इस्तेमाल कर सकते हैं:

auto baseMethod = [this](){ return Base::foo(); }; 
//... 
baseMethod(); 
+0

मीठा। एक जादू की तरह काम करता है। धन्यवाद! – OldPeculier

+0

क्षमा करें, मुझे यह नहीं मिला। आप ऑब्जेक्ट के बिना सदस्य फ़ंक्शन कैसे कर सकते हैं? – balki

+1

वह लैम्ब्डा अभिव्यक्ति केवल 'बेस' या' व्युत्पन्न '(या' बेस' का एक अन्य उप-वर्ग) के सदस्य फ़ंक्शन में काम करती है, और 'इस' को कैप्चर करती है। – aschepler