免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4763 | 回复: 21
打印 上一主题 下一主题

[c++] 多态性与递归函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-10 19:03 |只看该作者 |倒序浏览
  设计普通函数的时候,多态性很好用,例如:
  void insertOne(List *tab, char *str, int len)
  {
     strncmp(str, tab->key, len);
     if()
     {
       tab->next = new node(key);
     }
     return;
  }


  void insertOne(char *str)
  {
     insertOne(str, strlen(str));
     return;
  }
  
  但是,当设计递归函数的时候,多态性就不能向上面那么简单了,例如:
  
  void insertOne(Tree *tree, char *key, len)
  {
     if(tree == NULL)
     {
        tree = new node(key);
     }
     else(strncmp(tree->key, key, len) > 0)
     {
        insertOne(tree->right, char *key, len);
     }
     else(strncmp(tree->key, key, len) < 0)
     {
        insertOne(tree->left, char *key, len);
     }
   }
   
   void insertOne(Tree *tree, char *key)
   {
     /* 这个函数应该怎么写呢???? */
   }
   

论坛徽章:
0
2 [报告]
发表于 2012-07-11 08:55 |只看该作者
全TM是错误。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2012-07-11 09:13 |只看该作者
回复 2# _Rayx
昨晚看过一次,今早看过一次,代码全是错误,所以不知所云

论坛徽章:
0
4 [报告]
发表于 2012-07-11 09:14 |只看该作者
你这个实现和c++有关系吗?
node->InsertOne( key ) 才更有c++的范儿...

论坛徽章:
0
5 [报告]
发表于 2012-07-11 09:29 |只看该作者
回复 3# bruceteen


    我也看了两遍,愣是没看懂。

论坛徽章:
0
6 [报告]
发表于 2012-07-11 10:04 |只看该作者
bruceteen 发表于 2012-07-11 09:13
回复 2# _Rayx
昨晚看过一次,今早看过一次,代码全是错误,所以不知所云


我靠, 这么严重!!!!!!!!!!!!

要成灌水帖了, 不好意思, 我再试图描述一下啊
  1.   void insertOne(char *str, int len)
  2.   {
  3.      strncmp(str, List::key, len);
  4.      if()
  5.      {
  6.        List::key[i++] =  new node(key);
  7.      }
  8.      return;
  9.   }


  10.   void insertOne( char *str)
  11.   {
  12.      insertOne(str, strlen(str));
  13.      return;
  14.   }
复制代码
上面的代码函数insertOne有两种形态
   a: void insertOne(char *)
   b: void insertOne(char *, int)

   a调用b

下面的两个函数想设计成同样方式
  1.   void insertOne(Tree *tree, char *key, int)
  2.   {
  3.      if(tree == NULL)
  4.      {
  5.         tree = new node(key);
  6.      }
  7.      else(strncmp(tree->key, key, len) > 0)
  8.      {
  9.         insertOne(tree->right, char *key, len);
  10.      }
  11.      else(strncmp(tree->key, key, len) < 0)
  12.      {
  13.         insertOne(tree->left, char *key, len);
  14.      }
  15.    }
  16.    
  17.    void insertOne(Tree *tree, char *key)
  18.    {
  19.      /* 这个函数应该怎么写呢???? */
  20.    }
复制代码
也有两种形态
      c: void insertOne(Tree *, char *, int)
      d: insertOne(Tree *, char *)

      问题是:想用d调用c

   抱歉,些过后没有回过头看, 随手写的代码, 大家别介意,表达意思而已

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
7 [报告]
发表于 2012-07-11 10:28 |只看该作者
难道你要求d也递归调用d而不是调用c?似乎没有必要吧

论坛徽章:
0
8 [报告]
发表于 2012-07-11 10:30 |只看该作者
这有多态什么事, 多载吧.
你想表达的真没看懂, 如果仅是调用的话:
  1. void InsertOne( Tree* tree, char* key )
  2. {
  3.    InsertOne( tree, key, strlen(key) );
  4. }
复制代码

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
9 [报告]
发表于 2012-07-11 10:40 |只看该作者
本帖最后由 www1862 于 2012-07-11 10:42 编辑

据说函数的重载 也是多态?
老师说 类的成员函数的覆盖也是多态

论坛徽章:
0
10 [报告]
发表于 2012-07-11 12:35 |只看该作者
回复 9# www1862
重载不是多态
覆盖也不是多态
多态必须是运行时绑定

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP