【问题标题】:Polymorphism by function parameter函数参数的多态性
【发布时间】:2011-01-11 06:50:54
【问题描述】:

好的 - 这可能是一个非常愚蠢的问题,但它一直困扰着我。

有没有一种语言

class Animal;
class Ape : public Animal
{...}

void doStuff(Animal* animalPtr)
{
    cout << "doing animal stuff" << endl;
}

void doStuff(Ape* apePtr)
{
    cout << "doing ape stuff" << endl;
}

Animal *ape = new Ape();
doStuff(ape);

会产生 "doing ape stuff" 吗? (请耐心等待我使用 C++ 语法) 为了澄清,我想要“一个接受参数并根据参数类型对其进行操作的函数”。

这有意义吗?当然,作为开发人员,您需要小心,因为看起来像 Animal 指针的实例实际上可能会调用 Ape 代码,因为在运行时它是被指向的 Ape 实例。

【问题讨论】:

    标签: c++ oop polymorphism language-design


    【解决方案1】:

    是的,有!这称为multiple dispatch。维基百科的文章非常好。可悲的是,它似乎只能通过大多数流行语言的语言扩展来支持,但是有一些(主要是深奥的)语言本身就支持它。

    【讨论】:

    • Common LISP... 为什么这是一个惊喜(不是!);)感谢您对术语的澄清和维基百科链接!
    • 不得不将其归类为深奥几乎令人难过:-p
    【解决方案2】:

    【讨论】:

    • 对于不支持多分派和/或模式匹配的语言,访客模式可能是最好的解决方案。
    【解决方案3】:

    有可能,但它不会是 C++,因为 C++ 中的函数重载查找是在编译时完成的,而不是这里需要的运行时。它需要一种允许类型提示和重载的动态语言。

    【讨论】:

    • 好吧,我知道 C++ 不支持我正在“排序”寻找的功能。当我用 C++ 编码时,我突然想到了。这就是动态/静态语言之间的区别吗?
    • 是的。动态语言在运行时而不是编译时进行类型检查/属性查找。它会稍微减慢它们的操作速度,但可以提供更大的灵活性。
    • 不不不 - 你可以拥有一种非常动态的语言(比如 Python),它不支持开箱即用......你必须使用特殊的“多方法”插件。
    • C++ 可以支持函数参数的查找。它没有,部分原因是性能原因。
    • @Steven:Python 既不支持类型提示也不支持重载,所以我并不感到惊讶。
    【解决方案4】:

    这里有一些令人困惑的不一致之处。您是否想要一个接受参数并根据参数类型对其进行操作的函数?这并不是真正的多态性,因为函数是孤独的,它们不是属于类或接口层次结构的方法。换句话说,它有点像将 OO 范式与过程范式混合在一起。

    如果它是您想要参数化的类型而不是变量,您可以使用 Java Generics 之类的东西。使用泛型,您可以通知方法传入的参数类型也将是可变的。该方法以通用方式作用于变量类型。

    【讨论】:

    • 很好地描述了我正在搜索的功能 - 我非常大胆地将它放入我的问题的编辑中。你是对的 - 多态性可能是一个糟糕的术语,但我没有想到其他的。
    【解决方案5】:

    Open Multi-Methods for C++,作者:Peter Pirkelbauer、Yuriy Solodkyy 和 Bjarne Stroustrup。

    本文讨论了将多方法集成到 C++ 中的语言扩展以及一些非常有趣的实现细节,例如处理动态加载的库和正确调度的实际布局。请注意,它还不是 C++ 标准的一部分,也可能不是任何主要编译器的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多