首页 > 解决方案 > C中的多态性和赋值运算符

问题描述

我在 中看到以下关于赋值运算符=的说法C

赋值运算符中有隐藏的多态类型:

  1. 强制多态性 - 当我们在类型之间进行隐式强制时。

  2. 参数多态性——考虑到赋值运算符是为 PL 中的每种类型定义的(原子类型和用户使用structand定义的类型enum)。

我确实理解关于 的第一句话Coercion,但我不明白赋值运算符为什么以及如何支持参数多态性。我可以举一个例子来澄清这个说法吗?

编辑:这是一本关于 PL 概念的书(用不同的语言编写)。通过说它具有隐式强制的强制多态性看起来像:

int number = 4.5;
// number = 4

所以说C没有多态性是不正确的。顺便说一下,重载也是多​​态性,而且(当然)在C.

标签: cpolymorphism

解决方案


与技术和科学术语的情况一样,术语“多态性”和“多态性”的使用和解释存在一些差异。当人们说 C 不支持多态性时,他们最有可能的意思是它不支持子类型多态性,因为那些喜欢更广泛地使用通用术语的人可能会这样称呼它。与您的断言相反,它也不支持临时多态性,即重载。

即使我们接受类型强制作为多态性的一种形式——这不是主流立场——在将 C 不支持多态性的说法脱离其适当的上下文时,你已经建立了一个稻草人。这更容易激怒而不是讨好,如果你实际上是在寻找答案而不是试图开始争论,我敢说这不是一个明智的策略。

然而,至于你明显的问题,

我确实理解关于强制的第一句话,但我不明白赋值运算符为什么以及如何支持参数多态性。我可以举一个例子来澄清这个说法吗?

我想文本意味着该=运算符由其左侧操作数的类型参数化,因为该运算符的行为在某种意义上取决于该类型而有所不同。具体来说,右手操作数被转换为左手操作数的类型,并且赋值的细节也可以解释为随该类型而变化。

但我发现将其描述为参数多态性是可疑的。参数多态性的标志通常是某处的显式参数。模板是人们在提到 C++ 中的参数多态性时通常谈论的内容,而 C 没有模板。尽管如此,C11 可以被认为在泛型选择中具有有限形式的参数多态性。


推荐阅读