首页 > 代码库 > 基类析构函数为虚函数
基类析构函数为虚函数
代码:析构函数为非虚函数
#include <iostream>using namespace std;class A { public: A() { cout << "A" << endl; } ~A() { cout << "~A" << endl; }};class B : public A{ public: B() { cout << "B" << endl; } ~B() { cout << "~B" << endl; }};int main(int argc, char** argv){ A *pa = new B(); delete pa; B *pb = new B(); delete pb;}
输出:
A
B
~A
A
B
~B
~A
指向子类对象的基类指针,析构过程未调用子类的析构函数,若子类申请内存空间,则将无法被释放,导致内存泄漏。
代码:析构函数为虚函数
#include <iostream>using namespace std;class A { public: A() { cout << "A" << endl; } virtual ~A() { cout << "~A" << endl; }};class B : public A{ public: B() { cout << "B" << endl; } virtual ~B() { cout << "~B" << endl; }};int main(int argc, char** argv){ A *pa = new B(); delete pa; B *pb = new B(); delete pb;}
输出:
A
B
~B
~A
A
B
~B
~A
指向子类对象的基类指针,析构过程先调用子类析构函数,再调用基类析构函数。
若析构函数为非虚函数时,delete p 会直接调用相应指针类型的析构函数 即父类析构函数。若析构函数为虚函数时,则会调用实际对象的析构函数,即子类析构函数,子类继承自父类,子类析构函数调用完,会接着调用父类析构函数。
基类析构函数为虚函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。