2010-11-19 13 views
6

वर्चुअल घोषित किए जाने वाले क्लास सदस्य फ़ंक्शन के लिए फ़ंक्शन पॉइंटर मान्य होगा?क्या वर्चुअल फ़ंक्शन के लिए पॉइंटर अभी भी लगभग बुलाया जाता है?

class A { 
public: 
    virtual void function(int param){ ... }; 
} 

class B : public A { 
    virtual void function(int param){ ... }; 
} 

//impl : 
B b; 
A* a = (A*)&b; 

typedef void (A::*FP)(int param); 
FP funcPtr = &A::function; 
(a->*(funcPtr))(1234); 

B::function कहा जाएगा?

+2

आपके पास कोड है। यह उन प्रश्नों में से एक है जिन्हें आप कोड चलाकर अपने आप उत्तर दे सकते थे। –

+0

क्योंकि आईडीई को फायर करने, परियोजना, कोड, संकलन, डीबग इत्यादि बनाने के लिए यहां से पूछना तेज़ है ... और यह अन्य को लाभ देगा, और यह प्रश्न/कोड खो जाएगा नहीं। – uray

+2

@ मार्टिन: क्या होगा यदि व्यवहार अपरिभाषित था? –

उत्तर

2

हां। यह वर्चुअल विरासत के साथ भी काम करता है।

+2

मुझे सी ++ पसंद है !!!! – uray

5

हां। मान्य कोड codepad या ideone पर परीक्षण करने के लिए:

class A { 
public: 
    virtual void function(int param){ 
     printf("A:function\n"); 
    }; 
}; 

class B : public A { 
public: 
    virtual void function(int param){ 
     printf("B:function\n"); 
    }; 
}; 

typedef void (A::*FP)(int param); 

int main(void) 
{ 
    //impl : 
    B b; 
    A* a = (A*)&b; 

    FP funcPtr = &A::function; 
    (a->*(funcPtr))(1234); 
} 
0

फ़ंक्शन कॉल किया जाएगा, जैसा कि आप सिर्फ विरासत में मिला समारोह आह्वान करने के लिए प्रयास करें।

0

उस चीज़ के लिए सबसे अच्छा परीक्षण कक्षा ए में एक शुद्ध वर्चुअल विधि बनाने के तरीकों को बनाना है। दोनों मामलों में (शुद्ध आभासी तरीकों के साथ या बिना), बी :: समारोह कहा जाएगा।