代码之家  ›  专栏  ›  技术社区  ›  mats

按功能参数的多态性

  •  10
  • mats  · 技术社区  · 16 年前

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

    有语言吗

    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++语法支持我) 为了澄清,我想要“一个接受参数并根据参数类型对其进行操作的函数”。

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

    5 回复  |  直到 16 年前
        1
  •  7
  •   Steven Schlansker    16 年前

    是的,有!这叫做 multiple dispatch . 维基百科的文章很好。遗憾的是,它似乎只能通过大多数流行语言的语言扩展来支持,但是有一些(大部分是深奥的)语言本身支持它。

        2
  •  7
  •   mloskot    16 年前
        3
  •  1
  •   Ignacio Vazquez-Abrams    16 年前

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

        4
  •  1
  •   D.C.    16 年前

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

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

        5
  •  1
  •   MSN    16 年前

    Open Multi-Methods for C++ 彼得·皮尔克鲍尔、尤里·索洛德基和比亚恩·斯特劳斯特鲁普。

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