福建定制网站开发,wordpress文章自定义来源,做翻译赚钱的网站好,这几年做哪些网站致富多态使用时#xff0c;如果子类中有属性开辟到堆区#xff0c;那么父类指针在释放时无法调用到子类的析构代码 解决方式#xff1a;将父类中的析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构共性#xff1a;
1.可以解决父类指针释放子类对象
2.都需要有具体的函数实现…多态使用时如果子类中有属性开辟到堆区那么父类指针在释放时无法调用到子类的析构代码 解决方式将父类中的析构函数改为虚析构或者纯虚析构
虚析构和纯虚析构共性
1.可以解决父类指针释放子类对象
2.都需要有具体的函数实现
虚析构和纯虚析构区别 如果是纯虚析构该类属于抽象类无法实例化对象
虚析构语法 virtual ~类名(){}
纯虚析构语法
virtual ~类名() 0;
类名::~类名(){}
代码示例
#includeiostream
using namespace std;
#includestringclass Animal
{
public:Animal(){cout Animal的构造函数调用 endl;}//利用虚析构可以解决 父类指针释放子类对象时不干净的问题/*virtual ~Animal(){cout Animal的虚析构函数调用 endl;}*///纯虚析构 需要声明也需要实现 虚析构和纯虚析构只能有一个故将上面注释//有了纯虚析构之后这个类也属于抽象类无法实例化对象virtual ~Animal() 0;//纯虚函数virtual void speak() 0;};Animal::~Animal()
{cout Animal的纯虚析构函数调用 endl;
}class Cat :public Animal
{
public:Cat(string name){cout Cat构造函数调用 endl;m_Name new string(name);//堆区创建属性}virtual void speak(){cout *m_Name小猫在说话 endl;}~Cat()//释放{if (m_Name ! NULL){cout Cat析构函数调用 endl;delete m_Name;m_Name NULL;}}string *m_Name;
};void test()
{Animal* animal new Cat(Tom);animal-speak();//父类指针在析构时候 不会调用子类中析构函数 导致子类如果有堆区属性 出现内存泄露delete animal;
}int main()
{test();return 0;
}总结 1.虚析构或纯虚析构都是用来解决通过父类指针释放子类对象 2.如果子类中没有堆区数据可以不写为虚析构或纯虚析构 3.拥有纯虚析构函数的类也属于抽象类