先给个例子:
class Animal
{
public:
Animal();
~Animal();
virtual void voice() = 0;
};
Animal::Animal()
{
cout << "Animal()" << endl;
}
Animal::~Animal()
{
cout << "~Animal()" << endl;
}
class Dog:public Animal
{
public:
Dog();
~Dog();
virtual void voice();
};
Dog::Dog()
{
cout << "Dog()" << endl;
}
Dog::~Dog()
{
cout << "~Dog()" << endl;
}
void Dog::voice(){
cout << "I am a dog: wang wang wang wang" << endl;
}
class Cat:public Animal
{
public:
Cat();
~Cat();
virtual void voice();
};
Cat::Cat()
{
cout << "Cat()" << endl;
}
Cat::~Cat()
{
cout << "~Cat()" << endl;
}
void Cat::voice(){
cout << "I am a cat: miao miao miao" << endl;
}
int main()
{
Animal *ani = new Dog;
ani->voice();
delete ani;
ani = new Cat;
ani->voice();
delete ani;
system("pause");
return 0;
}
输出结果为:
这里是在堆上创建的对象,delete了ani,发现结果中只有Dog和Cat的构造,却没有Dog和Cat的析构,而只析构了Animal,这就会发生内存泄漏。
解决的办法就是对基类Animal的析构函数变成虚函数,就会先调用子类的析构函数,然后再调用基类的析构函数,这样就形成了完全析构,避免了内存泄漏的问题,这里只需要在Animal的析构函数前面加个virtual即可:
class Animal
{
public:
Animal();
virtual ~Animal(); //虚析构函数
virtual void voice() = 0;
};
输出结果: