2015-10-26 2 views
1

Я следующий пример кода из двух классов программатора и CSstudent гдеисполнение деструктор объекта унаследованного класса

CSstudent:public Programmer 

деструкторы определяются для обоих классов:

class Programmer{ 
      ......... 
      public: 
       ~Programmer(){ 
       cout<<"A Programmer obj destroyed";  
     } 
     } 

class CSstudent:public Programmer{ 
      ......... 
     public: 
     ~CSstudent(){ 
      cout<<"CSstudent obj destroyed"; 
     } 
     } 

В настоящее время в основном():

int main(){ 
    CSstudent cs1; 

    /* call to CSstudent member functions by invoking the cs1 object 
     ........... */ 

    cout<<cs1.getName()<<cs1.getUni()<<cs1.getLang()<<endl; 
} 

После того как программа работает, я получаю следующее: CSstudent OBJ уничтожил программист OBJ уничтожил

Я знаю, что деструкторы не наследуются, и деструкторы вызываются, когда объекты выходят из области видимости. Я инициализировал объект CSstudent, затем зачем вызывается деструктор класса Programmer?

Я надеялся на этот выход: CSstudent OBJ разрушен

+0

Базовый класс также должен быть уничтожен. Деструктор запускается таким образом, что он может обрабатывать любые потенциальные ресурсы в базовом классе. –

+0

Вы просили об этом ... Студент наследует программиста, поэтому, когда вы создаете ученика, вы также должны создать программиста. Исходя из этого, как только вы уничтожаете ученика, вы также должны уничтожить программиста. Попытка поместить те же инструкции печати в конструктор. –

+1

Я настоятельно рекомендую прочитать книгу на C++. – SergeyA

ответ

5

Производный класс, по существу, содержит базовый класс внутри него. Когда производный класс строится, базовый класс строится первым и производный класс строится следующим образом (что имеет смысл, если ваш производный класс требует использования переменных базового класса, которые он предполагает, был правильно инициализирован). Противоположное верно при уничтожении, деструктор производного класса вызывается первым, тогда деструктор базового класса вызывается для очистки базового класса информации.

+0

Рекомендуем рекомендовать, чтобы OP добавлял конструкторам строку отладочной печати, подобную той, что была в деструкторах, чтобы увидеть, что происходит за кулисами. – user4581301

0

Поскольку внутренне, когда вы создаете объект CSstudent, создается объект Programmer. Таким образом, при удалении CSstudent базовый объект также должен быть удален.