下面看一个例子:
#include "stdio.h"
#include<cstring>
/***************************************/
class school
{
public:
school(const char *st_name);
~school();
private:
char* school_name;
};
school::school(const char *st_name)
{
school_name=new char[10];
memcpy(school_name,st_name,9);
printf("调用基类的构造函数\n");
}
school::~school()
{
delete []school_name;
printf("调用基类的析构函数\n");
}
/***************************************/
class student:public school
{
public:
student(const char *boy_name,const char *university_name);
~student();
private:
char* student_name;
};
student::student(const char *boy_name,const char *university_name):school(university_name)
{
student_name=new char[10];
memcpy(student_name,boy_name,9);
printf("调用子类的构造函数\n");
}
student::~student()
{
delete []student_name;
printf("调用子类的析构函数\n");
}
/***************************************/
int main()
{
school *p_base = new student("xiaoming","MIT");
delete p_base;
}
这个例子比较简单,先是定义一个school类作为基类,然后定义一个student类作为子类。然后打印先后定义的顺序。
可以发现,如果采用向上转换的形式,即用基类型的指针去访问子类,在析构此指针时候,子类的构造函数将不会被调用,这样可能会出现内存泄漏。
解决该问题的办法:将基类的虚构函数设置为虚函数,则可以避免这个问题。
class school
{
public:
school(const char *st_name);
virtual ~school();
private:
char* school_name;
};