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

C++虚析构函数

2011-12-24 16:58 218 查看
当释放类对象指针时,会调用类析构函数,但如果释放的基类指针是属于其派生类对象的,

这种行为未定义,为了保证派生类的析构函数也被调用,需要将基类析构函数定义为虚。

例子:

//1. 基类使用虚析构函数 (基类为A)

#include <iostream>

using namespace std;

class C {

public:

C() {

cout << "C::C()" << endl;

}

~C() {

cout << "C::~C()" << endl;

}

};

class D {

public:

D() {

cout << "D::D()" << endl;

}

~D() {

cout << "D::~D()" << endl;

}

};

class A {

private:

C *pc;

public:

A() {

cout << "A::A()" << endl;

pc = new C;

}

virtual ~A() {

cout << "A::~A()" << endl;

delete pc;

}

};

class B : public A {

private:

D *pd;

public:

B() {

cout << "B::B()" << endl;

pd = new D;

}

~B() {

cout << "B::~B()" << endl;

delete pd;

}

};

int main()

{

B *pb = new B;

A *pa = pb;

delete pa;

return 0;

}

运行结果:

A::A()

C::C()

B::B()

D::D()

B::~B()

D::~D()

A::~A()

C::~C()

没有内存泄露

// 2. 基类使用虚析构函数 (基类为A)

#include <iostream>

using namespace std;

class C {

public:

C() {

cout << "C::C()" << endl;

}

~C() {

cout << "C::~C()" << endl;

}

};

class D {

public:

D() {

cout << "D::D()" << endl;

}

~D() {

cout << "D::~D()" << endl;

}

};

class A {

private:

C *pc;

public:

A() {

cout << "A::A()" << endl;

pc = new C;

}

~A() {

cout << "A::~A()" << endl;

delete pc;

}

};

class B : public A {

private:

D *pd;

public:

B() {

cout << "B::B()" << endl;

pd = new D;

}

~B() {

cout << "B::~B()" << endl;

delete pd;

}

};

int main()

{

B *pb = new B;

A *pa = pb;

delete pa;

return 0;

}

运行结果:

A::A()

C::C()

B::B()

D::D()

A::~A()

C::~C()

存在内存泄露,B::D *pd 没有被释放






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