构造函数、析构函数是否要声明为虚函数的问题

结论:构造函数不能声明为虚函数,析构函数最好声明为虚函数(在作为base类的情况下)。

 

构造函数不能声明为虚函数的原因是:
        解释一:所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.

        解释二:虚函数的主要意义在于被派生类继承从而产生多态.   派生类的构造函数中,   编译器会加入构造基类的代码,   如果基类的构造函数用到参数,   则派生类在其构造函数的初始化列表中必须为基类给出参数,   就是这个原因.

 

析构函数设为虚函数的作用:     
        解释:在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。

例:

 #include   "stdafx.h"   
    
 #include   "stdio.h"  
   
  class   A      
  {  
  public:  
   
  A();  
  virtual   ~A();  
   
  };  
  A::A()  
  {  
   
  }  
   
  A::~A()  
  {  
   
  printf("Delete   class   AP/n");  
   
  }  
  class   B   :   public   A      
  {  
  public:  
  B();  
          ~B();  
   
  };  
   
  B::B()  
  {  
   
  }  
   
  B::~B()  
  {  
  printf("Delete   class   BP/n");  
  }  
  int   main(int   argc,   char*   argv[])  
  {  
  A   *b=new   B;  
  delete   b;  
            return   0;  
   
  }       
    
  输出结果为:Delete   class   B        
                          Delete   class   A  
   
  如果把A   的virtual   去掉:  
                        那就变成了Delete   class   A 

因此析构函数不声明为虚函数容易造成内存泄漏。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值