2010-03-31 14 views
7

कौन सी आभासी तालिका शुद्ध वर्चुअल फ़ंक्शन स्थित होगी? बेस क्लास या व्युत्पन्न कक्षा में?सी ++ में स्थित शुद्ध वर्चुअल फ़ंक्शन कहां है?

उदाहरण के लिए, वर्चुअल टेबल प्रत्येक वर्ग में कैसा दिखता है?

class Base { 

    virtual void f() =0; 
    virtual void g(); 
} 


class Derived: public Base{ 

    virtual void f(); 
    virtual void g(); 

} 
+0

संबंधित प्रश्न: http://stackoverflow.com/questions/2549618/ –

+0

कौन कहता है कि वर्चुअल टेबल है? मानक उनके बारे में कुछ भी नहीं कहता है और इस तरह वे लोगों की कल्पना का एक चित्र हैं :-) यदि आप संकलक विशिष्ट कार्यान्वयन विवरण चाहते हैं तो आपको उस कंपाइलर का उल्लेख करने की आवश्यकता है जिसका आप उपयोग कर रहे हैं। –

उत्तर

15

g++ -fdump-class-hierarchy layout.cpp एक फ़ाइल layout.cpp.class बनाता है।

 
Vtable for Base 
Base::_ZTV4Base: 4u entries 
0  (int (*)(...))0 
8  (int (*)(...))(& _ZTI4Base) 
16 __cxa_pure_virtual 
24 Base::g 

Class Base 
    size=8 align=8 
    base size=8 base align=8 
Base (0x7ff893479af0) 0 nearly-empty 
    vptr=((& Base::_ZTV4Base) + 16u) 

Vtable for Derived 
Derived::_ZTV7Derived: 4u entries 
0  (int (*)(...))0 
8  (int (*)(...))(& _ZTI7Derived) 
16 Derived::f 
24 Derived::g 

Class Derived 
    size=8 align=8 
    base size=8 base align=8 
Derived (0x7ff893479d90) 0 nearly-empty 
    vptr=((& Derived::_ZTV7Derived) + 16u) 
    Base (0x7ff893479e00) 0 nearly-empty 
     primary-for Derived (0x7ff893479d90) 

'पवित्रता' के f पांचवीं पंक्ति में परिवर्तन निकाला जा रहा है: layout.cpp.class की सामग्री निम्न दिखाएगा

 
16 Base::f 
+0

कूल सामान वास्तव में:) –

+0

+1 नाइस - सभी अनुमानित काम को हराया –

1

vtable प्रविष्टि बेस क्लास में होगी।

क्यों? चूंकि आपके पास बेस पॉइंटर प्रकार हो सकता है जिसमें व्युत्पन्न प्रकार ऑब्जेक्ट का पता होता है और फिर भी बेस प्रकार के पॉइंटर चर पर विधि को कॉल करें।

शुद्ध आभासी बस संकलक कि व्युत्पन्न प्रकार अपने स्वयं के कार्यान्वयन प्रदान करनी चाहिए बताता है, और वे आधार वर्ग 'कार्यान्वयन पर भरोसा नहीं कर सकते (यदि कोई भी आधार वर्ग में निर्दिष्ट किया जाता)

1

दोनों में वास्तव में। बेस क्लास vtable में शुद्ध वर्चुअल फ़ंक्शन के लिए pure_virtual_function_called() स्टब की ओर इशारा करते हुए एक स्लॉट होगा जो शायद प्रोग्राम को निरस्त कर देगा, जबकि व्युत्पन्न क्लास vtable वास्तविक कार्यान्वयन के लिए सूचक होगा।

2

प्रत्येक वर्ग का अपना स्वयं का vtable है। Base में NULL होगा, और Derived में प्रविष्टि लागू विधि के लिए कोड के लिए एक सूचक होगा।

+1

ठीक है, वास्तव में नहीं। वीसी ++ में प्रविष्टि सीआरटी फ़ंक्शन _purecall का पता है: http://thetweaker.wordpress.com/2010/06/03/on-_purecall-and-the-overheads-of-virtual-functions/ –

संबंधित मुद्दे