新的拓展:
- 如果使用基类指针释放动态创建的派生类对象,则需要将析构函数声明为虚函数(否则,会导致在派生类中新添加的成员没有被释放,导致内存泄漏。)
//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;
}
程序运行结果为:
- Person类构造函数被调用
- Student类构造函数被调用
- Student类析构函数被调用
- 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释放内存 |
注意:
当一个类不准备作为基类使用时,一般不要使析构函数成为虚函数,因为它会类增加一个虚指针和一个虚函数表,使得对象的尺寸翻倍,并会降低其可移植性。实际上,当且仅当类作为基类,才把析构函数声明为虚函数。