虚析构和纯虚析构
前言: 当使用父类指针指向子类对象,delete指针时,只会调用父类的析构函数,而不会调用子类的析构函数。这就存在子类对象没被释放
的问题,导致内存泄漏
- 父类上使用
虚析构
和纯虚析构
都能解决上面的问题,但是需要注意:纯虚析构也要有具体实现;且如果包含了纯析构函数,则变成了一个抽象类。 - 形式:virtual ~父类名() {}
//虚析构和纯虚析构
//场景:当使用父类指针指向子类对象,delete指针时,只会调用父类的析构函数,而不会调用子类的析构函数。这就存在子类对象没被释放的问题,导致内存泄漏
//父类上使用虚析构和纯虚析构都能解决上面的问题,但是需要注意:纯虚析构也要有具体实现;且如果包含了纯析构函数,则变成了一个抽象类。
//形式:virtual ~父类名() {}
class Base
{
public:
virtual void function() = 0;
Base()
{
cout << "Base构造函数\n";
}
//虚析构
virtual ~Base()
{
cout << "Base析构函数\n";
}
};
class Son : public Base
{
public:
//属性创建在堆上
int* p_age;
void function()
{
cout << "Son is working " << *p_age << endl;
}
Son(int age)
{
p_age = new int(age);
cout << "Son构造函数\n";
}
~Son()
{
if (p_age != NULL)
{
delete p_age;
p_age = NULL;
}
cout << "Son析构函数\n";
}
};
void test()
{
Base* b = new Son(20);
b->function();
delete b;
}
int main()
{
test();
return 0;
}