虚析构函数

新的拓展:

  • 如果使用基类指针释放动态创建的派生类对象,则需要将析构函数声明为虚函数(否则,会导致在派生类中新添加的成员没有被释放,导致内存泄漏。)
//Person.h
#include <iostream>
using namespace std;
class Person
{
  public:
    Person(char* name,bool sex)
    {
       m_name=new char[strlen(name)+1);
       strcpy(m_name,name);
       m_sex=sex;
       cout<<"Person类构造函数被调用!"<<endl;
    }
    virtual ~Person() //将析构函数声明为虚函数
    {
       delete []m_name;
       cout<<"Person类析构函数被调用!"<<endl;
    }
  protected:
     char *m_name;
     bool m_sex;
};

//Student.h
#include "Person.h"
class Student:public Person
{
  public:
    Student(char* name,char* sex,bool sex,char* major):Person(name,sex)
    {
       m_sno=new char[strlen(sno)+1];
       m_major=new char[strlen(major)+1];
       strcpy(m_sno,sno);
       strcpy(m_major,major);
       cout<<"Student类构造函数被调用!"<<endl;
    }
    ~Student()
    {
      delete []m_sno;
      delete []m_major;
      cout<<"类析构函数被调用!"<<endl;
    }
  private:
     char* m_sno;
     char* m_major;
};

main.cpp
#include "Student.h"
int main()
{
  Person *pPerson=new Student("1234","jennie",false,"Singer");
  delete pPerson;
  return 0;
}    

程序运行结果为:

  1. Person类构造函数被调用
  2. Student类构造函数被调用
  3. Student类析构函数被调用
  4. Person类析构函数被调用
Person *pPerson=new Student;
类名Student
数据成员m_name m_sex m_sno m_major

为m_name动态分配内存 为m_sno动态分配内存 为m_major动态分配内存

delete pPerson

调用Person类析构函数执行delete m_name 释放内存
调用Student类析构函数执行delete m_sno释放内存
调用Studen类析构函数执行 delete m-major释放内存

注意:
当一个类不准备作为基类使用时,一般不要使析构函数成为虚函数,因为它会类增加一个虚指针和一个虚函数表使得对象的尺寸翻倍,并会降低其可移植性。实际上,当且仅当类作为基类,才把析构函数声明为虚函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值