一般用在有继承关系的情况下,比如多态。
废话不说直接上代码:
#include <iostream>
class Base{
public:
Base(){
std::cout << "Base Constructor\n";
}
~Base(){
std::cout << "Base Destructor\n";
}
// virtual ~Base(){
// std::cout << "Base Destructor\n";
// }
};
class Derived:public Base{
public:
Derived(){
std::cout << "Derived Constructor\n";
}
~Derived(){
std::cout << "Derived Destructor\n";
}
private:
int * m_array;
};
int main() {
Base* base = new Base();
delete base;
std::cout << "--------------------------\n";
Derived* derived = new Derived();
delete derived;
std::cout << "--------------------------\n";
Base* base1 = new Derived();
delete base1; //这种情况下只会执行基类的析构函数,所以引入虚析构函数
return 0;
}
运行结果如下:
可以看到,第三种情况下执行的只有基类的析构函数,子类的析构函数并未执行,如果子类的析构函数中有释放堆的操作,那这样便存在内存泄露
改进代码
#include <iostream>
class Base{
public:
Base(){
std::cout << "Base Constructor\n";
}
// ~Base(){
// std::cout << "Base Destructor\n";
// }
virtual ~Base(){
std::cout << "Base Destructor\n";
}
};
class Derived:public Base{
public:
Derived(){
std::cout << "Derived Constructor\n";
}
~Derived(){
std::cout << "Derived Destructor\n";
}
private:
int * m_array;
};
int main() {
Base* base = new Base();
delete base;
std::cout << "--------------------------\n";
Derived* derived = new Derived();
delete derived;
std::cout << "--------------------------\n";
Base* base1 = new Derived();
delete base1; //这种情况下只会执行基类的析构函数,所以引入虚析构函数
return 0;
}
运行结果如下: