- 1 概述
- 2 情况分类
- 2.1 父类指针,父类对象
- 2.2 子类指针,子类对象 【父类析构函数为虚函数】
- 2.3 父类指针,子类对象
- 父类析构函数为虚函数,删除父指针
- 父类析构函数为虚函数,父指针做子类型转换后再删除
- 父类析构函数不实现,删除父指针
- 父类析构函数不实现,父指针做子类型转换后再删除
- 3 结构体
- 4 详解
- 参考
如下图,子类继承父类,delete就是依据指针指向的内存地址以及虚表指针。
具体删除内存多少与指针类型和虚表指针相关。
2.1 父类指针,父类对象正常释放自身。
#include#include using namespace std; class Father { public: Father() { cout << "father" << endl; } // virtual ~Father() {} virtual ~Father() { cout << "~father" << endl; } }; class Son: public Father { public: Son() { cout << "son" << endl; } ~Son() { cout << "~son" << endl; } }; int main() { Father father; }
- 结果
father ~father2.2 子类指针,子类对象 【父类析构函数为虚函数】
父类析构函数为虚函数,释放子类自身以及父类。
#include#include using namespace std; class Father { public: Father() { cout << "father" << endl; } // virtual ~Father() {} virtual ~Father() { cout << "~father" << endl; } }; class Son: public Father { public: Son() { cout << "son" << endl; } ~Son() { cout << "~son" << endl; } }; int main() { Son son; }
- 结果
father son ~son ~father2.3 父类指针,子类对象 父类析构函数为虚函数,删除父指针
#include#include using namespace std; class Father { public: Father() { cout << "father" << endl; } // virtual ~Father() {} virtual ~Father() { cout << "~father" << endl; } }; class Son: public Father { public: Son() { cout << "son" << endl; } ~Son() { cout << "~son" << endl; } }; int main() { Father *father = new Son(); delete father; }
- 结果
father son ~son ~father父类析构函数为虚函数,父指针做子类型转换后再删除
#include#include using namespace std; class Father { public: Father() { cout << "father" << endl; } // virtual ~Father() {} virtual ~Father() { cout << "~father" << endl; } }; class Son: public Father { public: Son() { cout << "son" << endl; } ~Son() { cout << "~son" << endl; } }; int main() { Father *father = new Son(); delete (Son *)father; }
- 结果
father son ~son ~father父类析构函数不实现,删除父指针
#include#include using namespace std; class Father { public: Father() { cout << "father" << endl; } // virtual ~Father() {} // virtual ~Father() { cout << "~father" << endl; } }; class Son: public Father { public: Son() { cout << "son" << endl; } ~Son() { cout << "~son" << endl; } }; int main() { Father *father = new Son(); delete father; }
- 结果
father son父类析构函数不实现,父指针做子类型转换后再删除
#include#include using namespace std; class Father { public: Father() { cout << "father" << endl; } // virtual ~Father() {} // virtual ~Father() { cout << "~father" << endl; } }; class Son: public Father { public: Son() { cout << "son" << endl; } ~Son() { cout << "~son" << endl; } }; int main() { Father *father = new Son(); delete (Son*)father; }
- 结果
father son ~son3 结构体
C++类就是对结构体的拓展,所以结构体和类的使用一致。
#include#include using namespace std; struct Father { public: Father() { cout << "father" << endl; } // virtual ~Father() {} virtual ~Father() { cout << "~father" << endl; } }; struct Son: public Father { public: Son() { cout << "son" << endl; } ~Son() { cout << "~son" << endl; } }; int main() { Father *father = new Son(); delete father; }
- 结果
father son ~son ~father4 详解
2.7 多态与虚函数
参考1、C++概述
2、C++多态的delete调用的是父类析构函数,那么子类对象的内存释放了吗?
3、delete基类指针释放子类对象
4、C++中虚函数和纯虚函数的区别



