निम्नलिखित सी ++ कोड पर विचार करें:आभासी सदस्य कार्यों के लिए पॉइंटर्स। यह कैसे काम करता है?
class A
{
public:
virtual void f()=0;
};
int main()
{
void (A::*f)()=&A::f;
}
मुझे लगता है कि करने के लिए है चाहते हैं, तो मैं कहता हूँ चाहते हैं कि & एक :: इस संदर्भ में च मतलब होगा "च के एक के कार्यान्वयन का पता()", चूंकि नियमित सदस्य कार्यों और आभासी सदस्य कार्यों के लिए पॉइंटर्स के बीच कोई स्पष्ट पृथक्करण नहीं होता है। और चूंकि ए f() को लागू नहीं करता है, यह एक संकलित त्रुटि होगी। हालांकि, यह नहीं है।
और न केवल वह। निम्नलिखित कोड:
void (A::*f)()=&A::f;
A *a=new B; // B is a subclass of A, which implements f()
(a->*f)();
वास्तव में बी :: एफ कॉल करेगा।
यह कैसे होता है?
क्योंकि संकलक ऐसा करता है! यदि एक सामान्य विधि को कॉल करना वर्चुअल विधि को कॉल करने से अलग नहीं है, तो आपको लगता है कि विधि पॉइंटर्स का उपयोग करते समय कोड अलग क्यों होता है। आपको क्या लगता है कि संकलक सामान्य विधि (आभासी और ordingary) में अनुवाद कर रहा है? –