सबसे पहले, मैं समझता हूं कि क्यों virtual
एकल विरासत के मामले में विनाशकों की आवश्यकता होती है और आधार सूचक के माध्यम से किसी ऑब्जेक्ट को हटाया जाता है। यह विशेष रूप से एकाधिक विरासत और के पीछे कारण है यह काम करता है। यह सवाल मेरे विश्वविद्यालय वर्गों में से एक में आया था, और कोई भी (प्रोफेसर सहित) यकीन है कि क्यों यह काम किया था:आभासी विनाशक और एकाधिक विरासत वाले वस्तुओं को हटाने ... यह कैसे काम करता है?
#include <iostream>
struct A
{
virtual ~A()
{
std::cout << "~A" << std::endl;
}
int memberA;
};
struct B
{
virtual ~B()
{
std::cout << "~B" << std::endl;
}
int memberB;
};
struct AB : public A, public B
{
virtual ~AB()
{
std::cout << "~AB" << std::endl;
}
};
int main()
{
AB* ab1 = new AB();
AB* ab2 = new AB();
A* a = ab1;
B* b = ab2;
delete a;
delete b;
}
इस के लिए उत्पादन होता है:
~AB
~B
~A
~AB
~B
~A
संकलक कैसे जान लेता है कि कैसे A
की और B
'कहते हैं जब a
या b
को हटाने रों नाशक के लिए? विशेष रूप से, AB
के लिए मेमोरी कैसा है (विशेष रूप से यह वर्चुअल फ़ंक्शन टेबल), जैसे कि A
और B
विध्वंसक कहलाए जा सकते हैं?
मेरे प्रोफेसर थी कि मेमोरी का सुझाव दे (कुछ) इस तरह बाहर रखी जाएगी:
AB
+---------+ +----+
| A VFT | - - - - - -> | ~A |
+---------+ +----+
| memberA |
+---------+ +----+
| B VFT | - - - - - -> | ~B |
+---------+ +----+
| memberB |
+---------+
// I have no idea where ~AB would go...
हम सभी उत्सुक कैसे इन विनाशकर्ता वास्तव में स्मृति में बाहर रखी और कर रहे हैं कर रहे हैं कि कैसे या तो a
या b
पर delete
बुला परिणामस्वरूप सभी विनाशकों को सही ढंग से बुलाया जा रहा है। यह समझ में आता है कि बेस ऑब्जेक्ट को एकल विरासत में काम करना (क्योंकि काम करने के लिए एक वर्चुअल फ़ंक्शन टेबल है), लेकिन स्पष्ट रूप से मैं चीजों को सही ढंग से समझ नहीं रहा क्योंकि मैं एकल विरासत संस्करण की समझ नहीं ले सकता और इसे लागू नहीं कर सकता इस एकाधिक विरासत उदाहरण के लिए।
तो यह कैसे काम करता है?
ठीक है, vtable प्रविष्टियों को '~ एबी ',' ए 'या' ~ बी' पर इंगित करने की आवश्यकता होगी ... –
@OliCharlesworth: आह, यह निश्चित रूप से अधिक समझ में आ जाएगा। – Cornstalks