析构函数的名称统一处理为destructor的目的是为了解决析构函数的重写。
而这又引出了一个问题:为什么要进行析构函数的重写?
是为了下面这种情况:
class Person
{
public:
~Person() { cout << "~Person" << endl; }
};
class Student : public Person
{
public:
~Student() { cout << "~Student" << endl; }
};
int main()
{
Person* p = new Person;
delete p;
p = new Student;
delete p;
return 0;
}
打印结果:
上面的代码可能存在内存泄漏的问题:
原因:p = new Student; delete p;
这段代码我们本意是想调用student的析构函数(在继承中,调用派生类的析构函数时,会自动调用基类的析构函数。即调用student的析构函数 = 调用student的析构函数 + person的析构函数),但它却只是调用了person的析构函数。
即:
本意:根据指针(引用)指向的对象类型来选择对应的析构函数
结果:根据指针(引用)的类型的来选择对应的析构函数
而根据指针(引用)指向的对象类型来选择对应的函数,这不就是多态的理念吗。
此时我们已经满足多态构造的2个条件的其中之一:基类的指针或引用, 剩下的我们需要满足派生类的析构函数构成基类析构函数的重写。而重写的条件是:返回值类型,函数名,参数列表都相同。对于析构函数,我们需要的就是函数名相同,因此将析构函数的名称统一处理为destructor.
处理后: