【问题标题】:what are Parametric and Inclusion polymorphism in C++什么是 C++ 中的参数和包含多态性
【发布时间】:2011-09-15 14:09:38
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ inclusion parametric-polymorphism


【解决方案1】:

Parametric polymorphism”在 C++ 中表示模板。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如果你仔细阅读,你应该明白参数多态性只适用于做同样事情的重载方法。也就是说,foo('8') 应该和foo(8) 做同样的事情。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 2015-02-22
      • 1970-01-01
      相关资源
      最近更新 更多