好的 - 这可能是一个非常愚蠢的问题,但它一直困扰着我。
是否有语言
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实例。
答案 0 :(得分:7)
是的,有!这称为multiple dispatch。维基百科的文章非常好。可悲的是,它似乎只能通过大多数流行语言的语言扩展来支持,但有一些(主要是深奥的)语言本身支持它。
答案 1 :(得分:7)
答案 2 :(得分:1)
可能,但它不是C ++,因为C ++中的函数重载查找是在编译时完成的,而不是运行时,这里需要。它需要一种允许类型提示和重载的动态语言。
答案 3 :(得分:1)
这里存在一些令人困惑的不一致。你想要一个接受一个参数的函数并根据参数的类型对它进行操作吗?这实际上不是多态,因为函数在它们的寂寞上,它们不是属于类或接口层次结构的方法。换句话说,它有点像将OO范例与程序范例混合在一起。
如果它是您要参数化的类型而不是变量,那么您将使用Java Generics之类的东西。使用泛型,您可以通知一种方法,即进入的参数类型也是可变的。该方法以通用方式作用于变量类型。
答案 4 :(得分:1)
Open Multi-Methods for C++,Peter Pirkelbauer,Yuriy Solodkyy和Bjarne Stroustrup。
本文讨论了将多方法集成到C ++中的语言扩展以及一些非常有趣的实现细节,例如处理动态加载的库和正确调度的实际布局。请注意,它还不是C ++标准的一部分,可能不是任何主要编译器的一部分。