Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7687704
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: C/C++

2011-03-30 20:36:42

  1. /*************************************************************************************
  2. * 文件名:
  3. * 功能:虚函数简单应用
  4. * 说明:虚函数应该在基类中声明,如果使用派生类层次结构必须是在最高层上声明。
  5.         在派生类重新定义的虚函数必须和基类中的虚函数有相同的函数名、返回类型
  6.         参数个数、参数次序及参数类型。
  7. * 时间:2011-3-30          --Lzy
  8. **************************************************************************************/
  9. //没有使用虚函数,说明引入虚函数的目的

  10. #include <iostream.h>
  11. #include <string.h>

  12. static int Line = 1;

  13. class CAnimal
  14. {
  15. protected:
  16.     char *name;

  17. public:
  18.     CAnimal(char *na)
  19.     {
  20.         name = new char[strlen(na)+1];
  21.         strcpy(name,na);
  22.     }

  23.     void display(){cout<<"("<<Line++<<"):动物(食草/食肉)"<<endl;}
  24. };

  25. class CHerbivorous:public CAnimal
  26. {
  27. public:
  28.     CHerbivorous(char *na):CAnimal(na){}
  29.     void display(){cout<<"("<<Line++<<"):食草动物"<<name<<endl;}
  30. };

  31. class CCarnivore:public CAnimal
  32. {
  33. public:
  34.     CCarnivore(char *na):CAnimal(na){}    
  35.     void display(){cout<<"("<<Line++<<"):食肉动物"<<name<<endl;}
  36. };

  37. void main()
  38. {
  39.     CAnimal animal(""), *ptrAni;
  40.     CHerbivorous herb("羚羊");
  41.     CCarnivore carn("老虎");

  42.     ptrAni = &animal;
  43.     ptrAni->display();

  44.     ptrAni = &herb;
  45.     ptrAni->display();
  46.     ((CHerbivorous *)ptrAni)->display();

  47.     ptrAni = &carn;
  48.     ptrAni->display();
  49.     ((CCarnivore *)ptrAni)->display();
  50. }
  51. /*总结:通过指针引起的普通成员函数的调用,仅仅与指针类型有关,而与指针正指向什么对象无关。
  52.         通过强制类型转换,可使指针与指向的对象类型一致 */

  53. //使用虚函数实例

  54. #include <iostream.h>
  55. #include <string.h>

  56. static int Line = 1;

  57. class CAnimal
  58. {
  59. protected:
  60.     char *name;

  61. public:
  62.     CAnimal(char *na)
  63.     {
  64.         name = new char[strlen(na)+1];
  65.         strcpy(name,na);
  66.     }

  67.     virtual void display(){cout<<"("<<Line++<<"):动物(食草/食肉)"<<endl;}
  68. };

  69. class CHerbivorous:public CAnimal
  70. {
  71. public:
  72.     CHerbivorous(char *na):CAnimal(na){}
  73.     void display(){cout<<"("<<Line++<<"):食草动物"<<name<<endl;}
  74. };

  75. class CCarnivore:public CAnimal
  76. {
  77. public:
  78.     CCarnivore(char *na):CAnimal(na){}    
  79.     void display(){cout<<"("<<Line++<<"):食肉动物"<<name<<endl;}
  80. };

  81. void main()
  82. {
  83.     CAnimal animal(""), *ptrAni;
  84.     CHerbivorous herb("羚羊");
  85.     CCarnivore carn("老虎");

  86.     ptrAni = &animal;
  87.     ptrAni->display();

  88.     ptrAni = &herb;
  89.     ptrAni->display();
  90.     ((CHerbivorous *)ptrAni)->display();

  91.     ptrAni = &carn;
  92.     ptrAni->display();
  93.     ((CCarnivore *)ptrAni)->display();
  94. }
  95. /*使用指针调用虚函数,在运行时才确定指针所指向的对象的类型,而与指针类型无关*/

  96. /*
  97. 虚析构函数:
  98.     在类层次结构中,使用基类指针指向由new建立的动态派生类对象,再使用delete删除指向动态派生类对象的指针,那么,不管基类指针所指向的对象是何种类型,都只调用基类的析构函数。    
  99.     在基类中有一个虚析构函数,当删除指针时,所调用的析构函数是指针所指向对象类型的析构函数,而不是和指针类型相对应的动态对象的析构函数。    
  100. */
阅读(2069) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~