मुझे एक सदस्य फ़ंक्शन पॉइंटर का उपयोग करने की आवश्यकता है जो कि अन्य कोड में उपयोग की जाने वाली बेस क्लास का तर्क लेता है। खैर, बस मैं नीचे कुछ उदाहरण की तरह [कुछ] करना चाहता हूँ। यह कोड ठीक काम करता है, लेकिन मुझे आश्चर्य है कि ऐसी कास्ट हमेशा सुरक्षित है या नहीं? मैं dynamic
या static
यहां नहीं डाल सकता।कास्टिंग सदस्य फ़ंक्शन पॉइंटर
#include <cstdio>
class C
{
public:
C() : c('c') {}
virtual ~C() {}
const char c;
};
class D : public C
{
public:
D() : d('d') {}
virtual ~D() {}
const char d;
};
class A
{
public:
A() {}
virtual ~A() {}
void f(C& c) { printf("%c\n",c.c); }
void g(D& d) { printf("%c %c\n",d.c,d.d); }
};
int main (int argc, char const* argv[])
{
void (A::*pf)(C& c) = &A::f;
void (A::*pg)(D& d) = reinterpret_cast<void (A::*)(D&)>(&A::f);
A a;
C c;
D d;
(a.*pf)(c);
(a.*pg)(d);
return 0;
}
आप कहते हैं कि कोड ठीक काम करता है, लेकिन यह मेरे लिए भी संकलित नहीं करता है। – Xeo
यह 'reinterpret_cast' के साथ काम करता है और (प्रतीत होता है); मुझे लगता है कि सवाल यह है, क्या यह सुरक्षित है? –
ठंडा यह है कि एफ और जी वास्तव में वर्चुअल हैं? यदि ऐसा है तो आप उन्हें ए से व्युत्पन्न कुछ वर्ग में ओवरराइड कर सकते हैं। –