您的位置:首页 > 编程语言 > C语言/C++

为什么用虚析构函数C++

2018-01-14 18:11 155 查看
//#include "stdafx.h"
#include <iostream>

using namespace std;

/*如果delete一个基类的指针时, 如果它指向的是一个子类的对象,
那么析构函数不为虚就会导致无法调用子类析构函数,从而导致资源泄露*/

class Animal
{
public:
Animal(string _name) :name(_name) {}
virtual void cry() const = 0;
virtual ~Animal() { cout << "~Animal" << endl; }
protected:
string name;
};

class Mouse : public Animal
{
public:
Mouse(string _name, bool _sex) : Animal(_name), sex(_sex) {}
virtual void cry() const
{
cout << "I'm " << name << ". I'm " << (sex ? "boy" : "girl") << ".吱吱吱" << endl;
}
virtual ~Mouse() { cout << "~Mouse" << endl; }
protected:
bool sex;
};

class Cat : public Animal
{
public:
Cat(string _name, bool _sex) : Animal(_name), sex(_sex) {}
virtual void cry() const
{
cout << "I'm " << name << ". I'm " << (sex ? "boy" : "girl") << ".喵喵喵" << endl;
}
virtual ~Cat() { cout << "~Cat" << endl; }
protected:
bool sex;
};

class Dog : public Animal
{
public:
Dog(string _name, bool _sex) : Animal(_name), sex(_sex) {}
virtual void cry() const
{
cout << "I'm " << name << ". I'm " << (sex ? "boy" : "girl") << ".汪汪汪" << endl;
}
virtual ~Dog() { cout << "~Dog" << endl; }
protected:
bool sex;
};

void Cry(Animal *Ap)
{
Ap->cry();
}

void Cry2(Animal &Ar)
{
Ar.cry();
}

void Pause()
{
Animal *Ap = NULL;
Ap = new Mouse("Tom", 1);
Cry(Ap);
Cry2(*Ap);
delete Ap;

Ap = new Cat("Fairy", 0);
Cry(Ap);
delete Ap;

Ap = new Dog("Jack", 1);
Cry(Ap);
delete Ap;
}

int main()
{
Pause();

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: