在C语言中,一组函数的名称可能因操作数类型的不同而不同,称为理论静态多态函数



一组只做一个词但名称不同的函数(如atoiatolatoll等)理论上称为多态函数吗?

例如,我有一个函数swap,它需要对不同类型的数据类型进行操作。因此,我有一个函数/操作,我有不同的实现,但不幸的是,由于该语言不支持使用相同的函数名,为了获得这样的功能,我需要制作变体swap_iswap_lswap_fswap_str等,并且必须根据操作数手动调用它们。

在设计代码时,可以将其设计为一个函数,具有不同的实现,这些实现根据操作数进行调用。但在这种情况下,程序员而不是编译器需要对函数进行静态绑定。如果程序员用C++实现它,那么设计将是相同的(因为他/她遵循了OOD方法),但在这种情况下,静态绑定可以由编译器完成,而不会打扰用户。

现在,如果在设计方法中swap是一个多态函数,那么C和C++设计实现中的这种差异会产生影响吗?这样我们就不能称这样的C实现为非多态的,而C++实现为多态的?

第1版:

另一个例子:

假设我们发送一个包含不同可能数据类型的并集,以及一个用变量包装的结构,该变量指示要使用并集的哪个组件。那么我们只能使用一个没有变体的函数名swap。在我们接收到函数中的结构后,我们可以根据联合中活动的数据类型在内部进行操作

  struct _generic {
     int type;
     union {
              int a;
              float b;
              char c;
     } component;
  } variable;
  swap (struct _generic var2, struct _generic var1)
  {
     if (var1.type == INTEGER)
     {
         /* code for integer */
     }
     else if (var1.type == FLOAT)
     {
        /* code for float */
     }
      .
      .
      .
  }

在这种情况下,我们使用另一种方式。

还要注意像printf中的省略号运算符...,这样我们也可以获得一些内置特性。

要点是,C语言不提供OOD的直接实现,但我们可以在C实现上使用OOD术语来实现吗?如果它是按照面向对象的设计来设计的?

假设差异是两个字符、三个字符还是十个字符?不同的函数会是多态的吗?我会说,不,他们不会。那么一个角色有什么特别之处呢?

它不是多态的,因为swap函数变体不能有多个签名。多态性的全部目的是限制程序员所做的维护,认为它只是过载而由人类完成肯定是错误的想法。诀窍就在术语"poly"one_answers"morphism"中。这些函数都没有多重性——它们只是碰巧以相似的名称提供了相似的功能,而且它们之间根本没有变形,所以它们肯定不是多态的。

我认为你在混合不同的概念和语言,这会导致混乱。在C++中,您所称的多态函数通常被称为重载函数:有不同的函数共享一个名称。多态性通常是指重写基类中函数行为的特性。函数本身将具有一组固定的名称、参数和返回类型(根据语言的不同,协变返回类型或反变参数有一定的空间)。

至于把C中的手动实现称为重载是否合适,我认为不合适。如果你扩展并滥用这个术语,你可以让它变得合适,以与编程面向对象汇编程序完全相同的方式(有些汇编程序允许您定义结构,您可以将地址添加到其他代码符号中作为结构的属性……这是否使其成为面向对象的汇编程序?)

C不表现出多态性。http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29关于多态性的信息。对于被认为是远程多态的C函数,所有函数都必须具有相同的名称,但操作不同的数据类型(也称为函数重载)。

在我看来,这并没有错,因为多态性和其他面向对象的术语不是依赖于语言的,而是一个概念。现在,不同的语言提供了不同的功能,通过这些功能,对象模型的实现要容易得多,而有些功能只是可能的,而在其他语言中是不可能的。

如果用OOD方法对一个问题进行建模,并遵循相同的模型用C和C++实现,保持方法相同,其中差异仅来自语言的有限特征集,然后对它们进行编译,然后两者都生成汇编代码。多态函数的C++输出在转换为asm后不再是多态的。

不同之处在于,C没有提供像在C++或其他OOP语言中那样容易实现OOD的功能。

相关内容

最新更新