2015-10-26 96 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时,基础对象也必须被删除。