c++之虚析构和純虚析构
发布时间:2020-12-16 09:06:16 所属栏目:百科 来源:网络整理
导读:多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码。 解决方式:将父类中的析构函数改为虚函数或純虚函数。 虚析构函数和純虚函数的共性: 可以解决父类指针释放子类对象; 都需要有具体的函数实现; 虚析构和析构函数的
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码。 解决方式:将父类中的析构函数改为虚函数或純虚函数。 虚析构函数和純虚函数的共性:
虚析构和析构函数的区别:
#include<iostream> using namespace std; class Animal { public: Animal() { cout << "Animal的构造函数调用" << endl; } /*virtual ~Animal() { cout << "Animal的析构函数调用" << endl; }*/ //对于纯虚析构,既要有声明,也需要在类外进行实现, 純虚函数是不需要实现的,只需要声明 virtual ~Animal() = 0; virtual void speak() = ; }; Animal::~Animal() { cout << Animal的析构函数调用 endl; } class Cat :: string name; Cat( name) { cout << Cat的Cat(string name)构造函数调用 endl; this->name = name; } ~Cat() { cout << Cat的析构函数调用 name; } void speak() { cout << 喵喵喵 endl; } }; class Dog : name; Dog(Dog的Dog(string name)构造函数调用Dog() { cout << Dog的析构函数调用汪汪汪 endl; } }; 这里必须传入地址 父类的引用指向子类的对象,实现动态多态 doSpeak() { Animal* animal = new Cat(tom"); 父类指针在析构时,不会调用子类中的析构函数。导致了子类中有堆区属性,出现内存泄漏; 解决方法,将父类析构函数声明为virtual animal->speak(); delete animal; cout << ----------------------- endl; animal = new Dog(jack); animal->speak(); delete animal; } int main() { doSpeak(); system(pausereturn ; } 输出: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |