2011-09-15 22 views
9

我正在阅读地址为https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html的一些C++文本。什么是C++中的参数化和包含多态性

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

任何人都可以给我一个清晰的解释或例子吗?

+0

你可能会感兴趣的阅读这个答案:http://stackoverflow.com/a/36949734/67634 – Zuu

回答

9

Parametric polymorphism”在C++意味着模板。

I 认为 C++中的“包含多态”表示标准所指的多态性:虚拟方法,子类等。

我觉得这个名字很笨拙,很受学术界的影响。

+0

该死的,打我吧。 – Edwin

3

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

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

+0

如果你读得更近一点,你应该明白参数多态只适用于做同样事情的重载方法。也就是说,'foo('8')'应该和'foo(8)'做同样的事情。 – Edwin

1

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

通用表示只能使用相同签名的版本,而不考虑类型的数量。

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

鉴于以下:

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

相关问题