jake1036

为多态基类声明virtual析构函数

                为多态基类声明virtual 析构函数

   一  首先看下面的代码

          
#inclue <isotream>
  
using namespace std ;
  
  
class TimeKeeper//基类 
     public :
        TimeKeeper() ;      
        
~TimeKeeper() ;        
  }
 ;

  
class AtomicClck : public TimeKeeper //原子钟 
  {
        
  }
 ; 
 
   
class WaterClck : public TimeKeeper  //水钟  
  {
        
  }
 ; 

  
class WristClck : public TimeKeeper //腕表 
  {
        
  }
 ; 

  
int main()
  
{
     
     TimeKeeper 
* ptk = getTimeKeeper() ; //工厂方法获取钟的对象 
     
     
     delete ptk ;  
//由于父类中的析构函数声明为非virtual,所以只会执行父类的析构函数
                   
//这样就会造成子类中特有成员内存泄露 
        
  }


  由于TimeKeeper的析构函数没有设置成为virtual,造成子类进行delete操作的时候,内存可能会发生泄漏,因为delete只会执行基类的析构函数。
 
   virtual 函数的作用是,允许子类对基类的操作进行客制化,所以如果父类中存在一个成员函数是virtual,那么可以肯定的是,需要设置父类的virtual 析构函数。




二 virtual 多余添加

当一个class 中不含有virtual函数,则表明它不打算作为基类使用,这时候如果令其析构函数为virtual,则会造成不必要的麻烦。
 考虑下面的简单类实例
    
class Point
  
{
     
public :
       Point(
int x, int y) ;   
       
~Point() ;
     
private :
       
int x , y ;            
  }
 ;


  该类只含有两个整形变量,所以它的大小是64bits,但是如果将析构函数变为virtual,则结果是96bits
  原因是,为了在运行期动态地执行函数,对象就需要存储某些信息,需要给出一个虚函数指针。
   vptr指向一个函数指针数组,每一个class都有一个函数指针数组。当对象调用一个virtual时,实际被调用的
   函数取决于该对象的vptr指向的那个vtbl,编译器在其中寻找适当的函数指针。

  所以如果一个对象中含有virtual函数,则对象的体积就会变大。
   

 三 纯虚函数 

 有时候可以使用纯虚析构函数,这时候该类为抽象类,即不能进行实例化的类。
 

四 总结
     (1) 有些基类就是为了作为base类,为了使用多态机制,那么我们需要为这些类得析构函数使用virtual。
     (2) 有些类就不是为了作为base类,string 或者一些stl,那么我们就不需要使用vlirtual
     (3) 基类中某个函数使用了virtual ,那么我们就需要为这个类得析构函数,使用virtual。
 

 

 






 

posted on 2011-05-03 11:30 kahn 阅读(619) 评论(0)  编辑 收藏 引用 所属分类: c++学习总结


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理