Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1547502
  • 博文数量: 596
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 173
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 15:50
个人简介

在线笔记

文章分类

全部博文(596)

文章存档

2016年(1)

2015年(104)

2014年(228)

2013年(226)

2012年(26)

2011年(11)

分类: C/C++

2014-12-10 10:41:28

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







阅读(807) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~