当释放类对象指针时,会调用类析构函数,但如果释放的基类指针是属于其派生类对象的,
这种行为未定义,为了保证派生类的析构函数也被调用,需要将基类析构函数定义为虚。
例子:
//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 没有被释放