C+=析构函数应当是虚函数,除非类不用作基数。

1. 
  1. //基数student的析构函数不是vi
  2. #include <iostream>
  3. #include <stdio.h>
  4. using namespace std;

  5. class student{
  6. public:
  7.     student(){
  8.         printf("%s constructor\n", __FUNCTION__);
  9.     }
  10.     ~student(){
  11.         printf("%s destructor\n", __FUNCTION__);
  12.     }
  13.     //virtual void study();
  14. private:
  15.     string m_name;
  16. };

  17. class studentLeader:public student{
  18. public:
  19.     studentLeader() {
  20.         printf("%s constructor\n", __FUNCTION__);
  21.     }
  22.     ~studentLeader(){
  23.         printf("%s destructor\n", __FUNCTION__);
  24.     }
  25.     //virtual void study();
  26. };



  1. int main(int argc, char **argv)
  2. {
  3.     studentLeader *sl = new studentLeader();
  4.     delete sl;
  5.     return 0;
  6. }

  7. ./a.out
  8. student constructor
  9. studentLeader constructor
  10. ~studentLeader destructor
  11. ~student destructor

出现问题了。
student的析构函数不是virtual,编译器对其使用静态联编,根据指针类型(student*),只调用student的析构函数
  1. int main(int argc, char **argv)
  2. {
  3.     student *s = new studentLeader();
  4.     delete s;
  5.     return 0;
  6. }

  7. ./a.out
  8. student constructor
  9. studentLeader constructor

  10. ~student destructor
2. 基数的析构函数使用virtual
原则:析构函数应当是虚函数,除非类不用作基数。


  1. #include <iostream>
  2. #include <stdio.h>
  3. using namespace std;

  4. class student{
  5. public:
  6.     student(){
  7.         printf("%s constructor\n", __FUNCTION__);
  8.     }
  9.     virtual ~student(){
  10.         printf("%s destructor\n", __FUNCTION__);
  11.     }
  12.     //virtual void study();
  13. private:
  14.     string m_name;
  15. };

  16. class studentLeader:public student{
  17. public:
  18.     studentLeader() {
  19.         printf("%s constructor\n", __FUNCTION__);
  20.     }
  21.     ~studentLeader(){
  22.         printf("%s destructor\n", __FUNCTION__);
  23.     }
  24.     //virtual void study();
  25. };

  26. int main(int argc, char **argv)
  27. {
  28.     //指针类型是基数
  29.     student *s = new studentLeader();
  30.     delete s;
  31.     return 0;
  32. }

  1. ./a.out
  2. student constructor
  3. studentLeader constructor
  4. ~studentLeader destructor //关键
  5. ~student destructor







<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(224) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kelsel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值