我正在地址https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html阅读一些C ++文本。
在UNIVERSAL POLYMORPHISM
部分中,作者提到了Parametric
和Inclusion
多态性。我不太清楚我理解这一点,特别是为什么在编译时实现Parametric
多态性而在运行时实现Inclusion
多态性?
有人能给我一个明确的解释或一个例子吗?
答案 0 :(得分:9)
答案 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中使用了类似的行为,我相信很多其他人都有类似的行为。