【问题标题】:Destructor execution of object of an inherited class继承类对象的析构函数执行
【发布时间】:2016-01-26 00:06:13
【问题描述】:

我有以下两个类的示例代码 ProgrammerCSstudent where

CSstudent:public Programmer

为这两个类定义了析构函数:

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

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

现在在 main() 中:

int main(){
    CSstudent cs1;

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

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

程序运行后,我得到以下信息: CSstudent 对象被销毁 一个 Programmer obj 被销毁

我知道析构函数不是继承的,当对象超出范围时会调用析构函数。我初始化了一个 CSstudent 对象,那么为什么调用 Programmer 类的析构函数呢?

我希望得到这样的输出: CSstudent obj 被销毁

【问题讨论】:

  • 基类也必须被销毁。它的析构函数运行,以便它可以处理基类中的任何潜在资源。
  • 你要求这个...学生继承自程序员,因此当你创建一个学生时,你还必须创建一个程序员。从这里开始,一旦你摧毁了一个学生,你也必须摧毁一个程序员。尝试在构造函数中放置相同的打印语句。
  • 我强烈建议阅读一本关于 C++ 的书。
  • 基类的析构函数也应该声明为virtual,以便通过基类指针删除派生实例。
  • 修改@SergeyA 的评论:确保它是a good book on C++。太多是由精通 C 或 Java 的人编写的,并且似乎假设 1:1 对应。

标签: c++ c++11 destructor


【解决方案1】:

派生类本质上包含其中的基类。构造派生类时,首先构造基类,然后构造派生类(这是有道理的,以防您的派生类需要使用它假定已正确初始化的基类变量)。析构则相反,先调用派生类析构函数,再调用基类析构函数清理基类信息。

【讨论】:

  • 建议建议OP在构造函数中添加类似于析构函数中的调试打印行,以查看幕后发生的事情。
【解决方案2】:

因为在内部创建 CSstudent 对象时,会创建 Programmer 对象。因此,当您删除 CSstudent 时,基础对象也必须被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 2016-03-01
    • 2023-03-30
    • 2011-10-28
    • 2013-06-22
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多