मैं एक ऐसा फ़ंक्शन बनाने के लिए 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();
}
यदि हां, तो क्या वाक्य रचना है?
मीठा। एक जादू की तरह काम करता है। धन्यवाद! – OldPeculier
क्षमा करें, मुझे यह नहीं मिला। आप ऑब्जेक्ट के बिना सदस्य फ़ंक्शन कैसे कर सकते हैं? – balki
वह लैम्ब्डा अभिव्यक्ति केवल 'बेस' या' व्युत्पन्न '(या' बेस' का एक अन्य उप-वर्ग) के सदस्य फ़ंक्शन में काम करती है, और 'इस' को कैप्चर करती है। – aschepler