उदाहरण के लिए, हम जानते हैं कि निम्नलिखित कोड विस्तृत रूप से निष्पादित होगा:

#include <iostream>

class Base {
public:
  virtual ~Base() {
    std::cout << "Destroying base" << std::endl;
  }
};

class Derived: public Base {
public:
  ~Derived() {
    std::cout << "Destroying derived" << std::endl;
  }
};

int main()
{
  Base* p = new Derived();
  delete p;
}

$ g++ --std=c++11 main.cc -o main; ./main
Destroying derived
Destroying base

संकलक द्वारा उस व्यवहार को कैसे कार्यान्वित किया जाता है? उत्तर को शायद vtable के कार्यान्वयन के बारे में भी बात करने की आवश्यकता होगी।

एक उच्च स्तरीय, समझने में आसान उत्तर की अत्यधिक सराहना की जाती है!

c++
0
Zhen Zhang 13 अक्टूबर 2020, 10:41

1 उत्तर

सबसे बढ़िया उत्तर

C++ के दृष्टिकोण से, कंस्ट्रक्टर और डिस्ट्रक्टर विशेष कार्य हैं। उदाहरण के लिए, उनके पास रिटर्न प्रकार नहीं हैं।

ठेठ सी ++ कंपाइलर कम से कम इसके परिप्रेक्ष्य से, अभी भी एक सामान्य सामान्य कार्य उत्पन्न करने की संभावना है। यह लिंकर को सरल रखता है। लेकिन फ़ंक्शन में आपके अपने C++ कोड से थोड़ा अधिक हो सकता है। हालाँकि, आपको इस फ़ंक्शन का पता नहीं मिल सकता है।

इस विशेष मामले में, कंपाइलर Derived::~Derived के बाइनरी में Base::~Base को कॉल इनलाइन कर सकता है। यह काफी आसान है, कोई आभासी या एकाधिक विरासत जटिल चीजें नहीं हैं।

टिप्पणियों से पता चलता है कि vtable शामिल हो सकता है। जाहिर है, संकलक जो vtables का उपयोग करते हैं, उन्हें उस तालिका में Derived::~Derived के लिए एक प्रविष्टि डालनी होगी क्योंकि यह virtual है। यह संभवतः वही नियमित कार्य होगा जिसमें इनलाइन Base::~Base कॉल शामिल है।

0
MSalters 13 अक्टूबर 2020, 09:54