Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1324868
  • 博文数量: 281
  • 博客积分: 8800
  • 博客等级: 中将
  • 技术积分: 3345
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-17 22:31
文章分类

全部博文(281)

文章存档

2013年(1)

2012年(18)

2011年(16)

2010年(44)

2009年(86)

2008年(41)

2007年(10)

2006年(65)

我的朋友

分类: C/C++

2006-08-31 16:43:08

当用基类对象的指针指向一个new生成派生类对象时,如果通过delete删除基类得指针:
1-如果基类析构函数不为虚析构函数,则只会调用基类得析构函数,而派生类的析构函数不会被调用,因此派生类的内存空间不会被清除。
2-如果基类析构函数为虚析构函数,则删除基类只指针的时候会调用基类和派生类中的所有析构函数,所有空间都将被释放。
#include
using namespace std;
class Base1 {
public:
  ~Base1() { cout << "~Base1()\n"; }
};
class Derived1 : public Base1 {
public:
  ~Derived1() { cout << "~Derived1()\n"; }
};
class Base2 {
public:
  virtual ~Base2() { cout << "~Base2()\n"; }
};
class Derived2 : public Base2 {
public:
  ~Derived2() { cout << "~Derived2()\n"; }
};
int main() {
  Base1* bp = new Derived1; // Upcast
  delete bp;
  Base2* b2p = new Derived2; // Upcast
  delete b2p;
} ///:~
运行结果:
~Base1()  
~Derived2()
~Base2()  
   
可以看出,基类base1的析构函数不为虚函数,删除bp时只调用了base1的析构函数。但Base2定义了虚析构函数,删除b2p的时候,不但调用了基类析构函数,还调用了派生类析构函数。因该注意调用的顺序。
阅读(1442) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~