Chinaunix

标题: [c++] 多态性与递归函数 [打印本页]

作者: inet_addr    时间: 2012-07-10 19:03
标题: [c++] 多态性与递归函数
  设计普通函数的时候,多态性很好用,例如:
  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)
   {
     /* 这个函数应该怎么写呢???? */
   }
   
作者: _Rayx    时间: 2012-07-11 08:55
全TM是错误。
作者: bruceteen    时间: 2012-07-11 09:13
回复 2# _Rayx
昨晚看过一次,今早看过一次,代码全是错误,所以不知所云
作者: hgrany    时间: 2012-07-11 09:14
你这个实现和c++有关系吗?
node->InsertOne( key ) 才更有c++的范儿...
作者: _Rayx    时间: 2012-07-11 09:29
回复 3# bruceteen


    我也看了两遍,愣是没看懂。
作者: inet_addr    时间: 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

   抱歉,些过后没有回过头看, 随手写的代码, 大家别介意,表达意思而已
作者: hellioncu    时间: 2012-07-11 10:28
难道你要求d也递归调用d而不是调用c?似乎没有必要吧
作者: hgrany    时间: 2012-07-11 10:30
这有多态什么事, 多载吧.
你想表达的真没看懂, 如果仅是调用的话:
  1. void InsertOne( Tree* tree, char* key )
  2. {
  3.    InsertOne( tree, key, strlen(key) );
  4. }
复制代码

作者: www1862    时间: 2012-07-11 10:40
本帖最后由 www1862 于 2012-07-11 10:42 编辑

据说函数的重载 也是多态?
老师说 类的成员函数的覆盖也是多态
作者: lifcu3    时间: 2012-07-11 12:35
回复 9# www1862
重载不是多态
覆盖也不是多态
多态必须是运行时绑定

   
作者: folklore    时间: 2012-07-11 12:57
回复 9# www1862


    you have a poor teacher... amen




作者: aychxm    时间: 2012-07-11 13:06
类都没有,玩鸟蛋的多态啊!
作者: OwnWaterloo    时间: 2012-07-11 14:25
回复 6# inet_addr

inet_addr 发表于 2012-07-11 10:04
   a: void insertOne(char *)
   b: void insertOne(char *, int)
a调用b

insertOne(char* k) { return insertOne(k, strlen(k)); }

inet_addr 发表于 2012-07-11 10:04
      c: void insertOne(Tree *, char *, int)
      d: insertOne(Tree *, char *)

      问题是:想用d调用c


insertOne(Tree* t, char* k) { return insertOne(t, k, strlen(k)); }
有什么区别?


inet_addr 发表于 2012-07-11 10:04
随手写的代码, 大家别介意,表达意思而已

随手写的代码,错误一大堆,而且还不是手误那种小错误,还怎能表达意思?又怎能不介意?

void insertOne(Tree *tree, char *key, int)
...
        tree = new node(key);
...

能看懂我为什么要把这两行抓出来的人,都应该都看不懂你写这代码是打算做什么。

你知道下面的事实吗?

  1. void f(int* x) { x = new int(12); };
  2. int* p = 0;
  3. int* original = p;
  4. f(p);
  5. assert(p == original);
复制代码
f(p) 不能改变外部的p。

作者: www1862    时间: 2012-07-11 14:29
folklore 发表于 2012-07-11 12:57
回复 9# www1862

I agree with you. Could you introduce some books for me?
作者: OwnWaterloo    时间: 2012-07-11 14:32
回复 1# inet_addr

至于这个叫不叫多态,是有分歧的。
Haskell社区认为重载是一种多态。
而C++社区有认为它是的,并冠上静多态以与virtual那种相区别。也有认为它不是多态的。

但无论怎样,不把这个叫重载的社区或人应该不多。
如果一开始就用重载这术语,引起的误会会更少。

作者: folklore    时间: 2012-07-11 14:34
回复 14# www1862


    unfortunatly, i am not read any book now.and can't give you any advise. just try to use google, and it may be enought to resolve at most any promble.

作者: www1862    时间: 2012-07-11 14:37
本帖最后由 www1862 于 2012-07-11 14:41 编辑
lifcu3 发表于 2012-07-11 12:35
回复 9# www1862
重载不是多态
覆盖也不是多态
为什么网上很多人都说 覆盖是多态?函数重载叫编译时多态,成员函数的覆盖称为运行时多态。so i'm confused!
作者: lifcu3    时间: 2012-07-12 10:52
覆盖和重载说白了是多个函数,虽然它们的函数名相同,但并不是同一个函数

作者: nizvoo    时间: 2012-07-13 11:10
不知所云何事。
作者: blackuhlan    时间: 2012-07-13 14:23
多态就是多态,重载就是重载,覆盖就是覆盖。这个很难懂迈?
作者: blackuhlan    时间: 2012-07-13 14:24
重载是有运算符重载的,难道要叫运算符多态吗?
作者: KanonInD    时间: 2012-07-13 18:03
C++只有那个带virtual的subtype polymorphism 的多态吗?
overloading 在Haskell社区叫 Ad-hoc polymorphism




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2