Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5142506
  • 博文数量: 1696
  • 博客积分: 10870
  • 博客等级: 上将
  • 技术积分: 18357
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-30 15:16
文章分类
文章存档

2017年(1)

2016年(1)

2015年(1)

2013年(1)

2012年(43)

2011年(17)

2010年(828)

2009年(568)

2008年(185)

2007年(51)

分类: C/C++

2010-07-30 11:52:38

#include  
class   a
{
public:
      a(){cout < < "this   is   a " < virtual   void   show(){cout < < "a::show " <         ~a(){cout < < "delete   a " <
};
class   b:public   a
{
public:
b(){cout < < "this   is   b " < ~b(){cout < < "delete   b " <         void   show(){cout < < "b::show " < void   display(){show();};

};
void   main()
{
          a*   pa;
  pa=new   b;  
       
  delete   pa;
}    
 
/*我知道析钩函数一定要声明为虚的,只有这样,在delete   pa以后,才能按正确的顺序依次调用
派生类的析构和基类的析构来释后内存自由存储区,但我不明白的是为什么不虚,就会只调用一
次基类的析构函数,而不是派生类的析构函数。*/

=======================================================

如果函数不是   virtual   的,则进行的是静态绑定,即在编译期间就决定了其调用的函数。

对于上面的程序来说,   delete   pa;,即使基类指针   pa   实际上指向的是派生类对象,但是编译器也会把这个基类指针和指向类型(基类)的析构函数进行静态绑定,从而达不到调用派生类析构函数的目的。
阅读(1386) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~