9

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

在 一节UNIVERSAL POLYMORPHISM中,作者提到了关于ParametricInclusion多态性。我不太确定我是否理解这一点,尤其是为什么Parametric多态是在编译时实现的,而Inclusion多态是在运行时实现的?

谁能给我一个清楚的解释或一个例子,好吗?

4

3 回答 3

9

C++中的“参数多态”是指模板。

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

我认为这些名字很笨拙,有点学术界的味道。

于 2011-09-15T14:15:51.100 回答
3

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

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

于 2011-09-15T14:22:31.340 回答
1

我理解通用多态与我们在 C++ 中所期望的不同。C++ 是临时多态性。

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

于 2011-09-15T14:49:37.833 回答