什么是C ++中的Parametric和Inclusion多态性

时间:2011-09-15 14:09:38

标签: c++ inclusion parametric-polymorphism

我正在地址https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html阅读一些C ++文本。

UNIVERSAL POLYMORPHISM部分中,作者提到了ParametricInclusion多态性。我不太清楚我理解这一点,特别是为什么在编译时实现Parametric多态性而在运行时实现Inclusion多态性?

有人能给我一个明确的解释或一个例子吗?

3 个答案:

答案 0 :(得分:9)

C ++中的“Parametric polymorphism”表示模板。

认为 C ++中的“包含多态”意味着标准所指的多态性:虚方法,子类等。

我认为学术界的名字很笨拙。

答案 1 :(得分:3)

我认为'Parametric'指的是method/function overloading - 我们可以通过查看它的参数的数据类型来确定在编译时使用什么方法。

并且'包含'意味着method/function overriding - 在父子类关系中,如果父类和子类具有相同的功能,那么它将在运行时确定(取决于对象类型)什么方法将被援引。

答案 2 :(得分:1)

我理解通用多态性与我们在C ++中的期望不同。 C ++是ad-hoc多态。

Universal说,无论类型的数量如何,都只能有相同签名的版本。

我认为其他答案略过于参数和包含是通用类别的细节。鉴于原文,我可以看出他们或我是如何被混淆的。 ;)

鉴于以下内容:

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中使用了类似的行为,我相信很多其他人都有类似的行为。