2013-02-06 18 views
5

पर विचार करें नीचे दिए गए कोड:सी ++: वर्चुअल विरासत

#... 
class A {}; 
class B: public A{}; 
class C: virtual public A{}; 
class D: virtual public C{}; 
// No More Classes 
... 
int _tmain(int argc, _TCHAR* argv[]) { 
cout<<sizeof(A)<<" "; 
cout<<sizeof(B)<<" "; 
cout<<sizeof(C)<<" "; 
cout<<sizeof(D)<<"."; 

... 
} 

ओ/पी: 1 1 4 8.

प्रश्न:

  1. sizeof (ए) = 1byte, और इस स्थान कंपाइलर/हमें के लिए महत्वपूर्ण क्या पकड़ो।
  2. क्यों संकलक सी क्लास ऑब्जेक्ट में vptr जोड़ने के लिए परेशान क्यों होता है जब वास्तव में कुछ भी नहीं रहता है।
  3. यदि हमारे पास कोई वर्चुअल फ़ंक्शन नहीं है, तो कंपाइलर व्युत्पन्न वस्तुओं के लिए एक अतिरिक्त Vptr जोड़ रहा है।

*। यह मेरा पहला प्रश्न है, अगर आपको कुछ गलत लगता है तो कृपया मुझे सही करें।

+0

यहां एक पहले प्रश्न के लिए: एक अच्छी, अच्छी तरह से स्वरूपित और आत्म-व्याख्यात्मक पोस्ट के लिए +1। –

+2

मुझे वास्तव में कोई प्रश्न नहीं दिखाई देता है, केवल बयानों की एक सूची। –

+0

@ जोचिमपिलबोर्ग - "2. क्यों कंपेलर सी क्लास ऑब्जेक्ट में वीपीआरआर जोड़ने की परेशानी क्यों करता है जब वास्तव में कुछ भी नहीं रहता है"। मुझे लगता है कि '3.'' .2' जैसा ही है। और '1.' सबसे अधिक संभावना है - यह दर्शाता है कि ओपी जानता है कि परिणाम' 1' क्यों है। –

उत्तर

8

संक्षेप में यह वर्ग वर्चुअल होने के कारण नहीं है, ऐसा इसलिए है क्योंकि मानक की आवश्यकता है कि सभी ऑब्जेक्ट्स उनके स्मृति पते से अलग हो जाएं। इस सवाल देखें:

Why is the size of an empty class in C++ not zero?

+0

आपने मुझे इसे हराया, अच्छा जवाब के लिए +1! – odinthenerd

0

विज्ञापन 1. देखें PeddleSpam's answer

विज्ञापन 2. IIRC संकलक तथाकथित VMT में सिर्फ आभासी कार्यों संकेत की तुलना में अधिक जानकारी रखता है। एक और जानकारी सी में आभासी ए की स्थिति है, मुझे लगता है।

विज्ञापन 3. देखें 2.