博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 子类调用父类构造和析构函数的顺序
阅读量:4071 次
发布时间:2019-05-25

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

  1. #include <iostream>  
  2. using namespace std;  
  3. class A{  
  4. public:  
  5.        A(){cout<<"Construct a"<<endl;p();}  
  6.        virtual void p(){cout<<"A"<<endl;}  
  7.        ~A(){cout<<"Destruct a"<<endl;p();}     
  8. };  
  9. class B : public A{  
  10. public:  
  11.        B(){cout<<"Construct b"<<endl;p();}  
  12.        void p(){cout<<"B"<<endl;}  
  13.        ~B(){cout<<"Destruct b"<<endl;p();}      
  14. };  
  15. int main()  
  16. {  
  17.     A *a=new B();  
  18.     delete a;  
  19.     getchar();  
  20.     return 0;  
  21. }  
  22.   
  23.   
  24.   
  25.   
  26. 打印的结果是:  
  27. Construct a  
  28. A  
  29. Construct b  
  30. B  
  31. Destruct a  
  32. A  

 

 

 

一般情况下构造函数调用父类-》子类;析构函数调用子类-》父类

比如这么写

 B *a=new B(); 先  析构 B类 再析构A类 

但如果是上面那种写法

  1. A *a=new B();  
  2.     delete a;  

 ,结果就是 构造函数相同,析构函数只调用A,因为a的类型是A,delete a时将调用类型A的析构函数;没析构B,造成内存泄露

一般遇到这样的现象,需要将基类的析构函数定义为虚拟的.

还有一种情况是是析构函数是虚函数,结果是:析构函数调用子类-》父类,不过内部原理不一样

delete a时调用类型A的析构函数步骤如下:

1,到虚函数映射表中查找A的实际析构函数;
2,发现被实例化为B的析构函数;
3,调用B的析构函数;
4,调用A的析构函数---如果A的析构不是纯虚函数的话。

 

 

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

你可能感兴趣的文章
monitorServer nagios / cacti / tivoli / zabbix / SaltStack
查看>>
my ReadMap subway / metro / map / ditie / gaotie / traffic / jiaotong
查看>>
OS + Linux DNS Server Bind
查看>>
web test flow
查看>>
web test LoadRunner SAP / java / Java Vuser / web_set_max_html_param_len
查看>>
OS + UNIX AIX command
查看>>
OS + UNIX AIX performance
查看>>
OS + UNIX AIX Tools
查看>>
my ReadBook_liutongjingjixue / circulation economics
查看>>
my ReadBook_wangluoyingxiaoyucehua / network marketing / wangluoyingxiao
查看>>
db base database
查看>>
监控服务器端口,Down掉会自动重启,并发送邮件 Linux Shell
查看>>
Git提交错误:RPC failed; result=22, HTTP code = 411
查看>>
Druid使用ConfigFilter
查看>>
Elicpse使用技巧-打开选中文件文件夹或者包的当前目录
查看>>
eclips 运行项目内存不足的解决方案
查看>>
linux 挂载盘阵 smb
查看>>
漫谈 JAVA程序员、架构师、项目经理
查看>>
OPC品质类型
查看>>
NTLDR.DLL丢失的一个解决方法
查看>>