2015-10-26 95 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對象,那麼爲什麼程序員類的析構函數會被調用?

我希望這個輸出: CSstudent OBJ破壞

+0

基類也必須銷燬。它的析構函數正在運行,以便它可以處理基類中的任何潛在資源。 –

+0

你問這個...學生繼承程序員,因此當你創建一個學生時,你還必須創建一個程序員。由此導致,一旦你摧毀了學生,你也必須摧毀一名程序員。嘗試在構造函數中放入相同的打印語句。 –

+1

我強烈建議閱讀一本關於C++的書。 – SergeyA

回答

5

派生類主要包含在它的基類。當構造派生類時,首先構造基類,然後構造派生類(這是有道理的,以防派生類需要使用它假定已正確初始化的基類變量)。在銷燬方面情況正好相反,首先調用派生類析構函數,然後調用基類析構函數來清除基類信息。

+0

推薦建議OP向構造函數添加一個類似於析構函數的調試打印行,以查看幕後發生了什麼。 – user4581301

0

由於在創建CSstudent對象時內部創建了一個Programmer對象。因此,當您刪除CSstudent時,基礎對象也必須被刪除。