C++中的参数多态和包含多态是什么?

9

我正在阅读一些关于C++的文本,网址为https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html

在章节通用多态性(UNIVERSAL POLYMORPHISM)中,作者提到了参数化(Parametric)包含(Inclusion)多态性。我不太确定我理解的是否正确,特别是为什么参数化(Parametric)多态性是在编译时实现而包含(Inclusion)多态性是在运行时实现?

有人能给我一个清晰的解释或示例吗?


您可能会对阅读此答案感兴趣:https://dev59.com/KVoU5IYBdhLWcg3w7aCP#36949734 - Zuu
3个回答

9
在C++中,“参数化多态性”意味着模板。
我认为,在C++中,“包含多态性”意味着标准所指的多态性:虚方法、子类等等。
我认为这些名称很笨拙,有学术气息。

3

我认为,'参数化'指的是方法/函数重载 - 通过查看其参数的数据类型,我们可以在编译时确定要使用哪个方法。

而 '包含' 意味着方法/函数覆盖 - 在父类和子类关系中,如果父类和子类都有相同的函数,那么在运行时(取决于对象类型)将确定调用哪种方法。


如果你仔细阅读,就应该明白参数多态仅适用于做相同事情的重载方法。也就是说,foo('8') 应该和 foo(8) 做相同的事情。 - Edwin

1

我了解到通用多态与C ++中的预期不同。C ++是特定场景下的多态。

通用多态表示相同签名只能有一个版本,而与类型数量无关。

我认为其他答案忽略了参数和包含是通用范畴的类别。在阅读原始文本后,我可以理解它们或我曾感到困惑。;)

给定以下:

struct Foo {
  virtual void foo();
};

struct Bar {
  virtual void bar();
  // virtual void foo(); // this would error
};

参数化会像这样:

struct FooBar : public Foo, public Bar {};

FooBar中包含的签名在编译时静态确定。

C++不直接支持包容多态性。它们更接近脚本语言中可能找到的注入,其中函数是一级的。

请不要字面上理解这段代码,这只是为了演示。

struct FooBar {};

int main() {
  FooBar foob;
  foob.foo = Foo::foo;
  foob.bar = Bar::bar;
  return 0;
}

FooBar 在编译时不知道其接口,它是动态组合的。我在 JavaScript 和 Lua 中使用了类似的行为,我相信许多其他人也有类似的经验。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接