博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构造函数、析构函数是否要声明为虚函数的问题
阅读量:4169 次
发布时间:2019-05-26

本文共 808 字,大约阅读时间需要 2 分钟。

结论:构造函数不能声明为虚函数,析构函数最好声明为虚函数(在作为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 

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

转载地址:http://jbgxi.baihongyu.com/

你可能感兴趣的文章
Java面试官经验谈:如何甄别候选人真实的能力,候选人如何展示值钱技能
查看>>
分析若干没面试机会和没体现实力的简历
查看>>
用python的matplotlib和numpy库绘制股票K线均线
查看>>
以互联网公司的经验告诉大家,架构师究竟比高级开发厉害在哪?
查看>>
GanttProject 使用的控件第三方包:jdnc-modifBen.jar
查看>>
ps、grep和kill联合使用杀掉进程
查看>>
openfire中的mina框架使用
查看>>
去掉Windows Messager的自动登录
查看>>
dspace可以检索中文了
查看>>
利用Eclipse编辑中文资源,配置文件
查看>>
将中文转为unicode 及转回中文函数
查看>>
《程序员》专访金蝶:是谁不相信国产软件?
查看>>
debian的gnome下的xmms乱码解决方案
查看>>
实习日记
查看>>
ln中符号链接与硬链接的区别
查看>>
solr cloud zk管理
查看>>
使用HBase Indexer建立二级索引(整合最新版本的HBase1.2.6及Solr 7.2.1)
查看>>
CentOS7 安装 VirtualBox5.2.8启动系统是出错
查看>>
SLF4j多个log4j2的实现类导致日志生成不了
查看>>
Quartz定时调度CronExpression配置格式说明与实例
查看>>