Estoy tratando de entender qué es el despacho múltiple. Leí muchos textos diferentes, pero aún no tengo idea de qué es el despacho múltiple y para qué sirve. Tal vez lo que me falta es una pieza de código que utiliza múltiples despachos. Por favor, ¿puedes escribir un pequeño fragmento de código en C++ usando el envío múltiple para que pueda ver que no se puede compilar/ejecutar correctamente porque C++ solo tiene un solo despacho? Necesito ver la diferencia. Gracias.Despacho múltiple en C++
Respuesta
Multi-dispatch es la capacidad de elegir qué versión de una función llamar en función del tipo de tiempo de ejecución de los argumentos pasados a la llamada a la función.
He aquí un ejemplo que no funciona la derecha en C++ (no probado):
class A { };
class B : public A { };
class C : public A { }
class Foo
{
virtual void MyFn(A* arg1, A* arg2) { printf("A,A\n"); }
virtual void MyFn(B* arg1, B* arg2) { printf("B,B\n"); }
virtual void MyFn(C* arg1, B* arg2) { printf("C,B\n"); }
virtual void MyFn(B* arg1, C* arg2) { printf("B,C\n"); }
virtual void MyFn(C* arg1, C* arg2) { printf("C,C\n"); }
};
void CallMyFn(A* arg1, A* arg2)
{
// ideally, with multi-dispatch, at this point the correct MyFn()
// would be called, based on the RUNTIME type of arg1 and arg2
pFoo->MyFn(arg1, arg2);
}
...
A* arg1 = new B();
A* arg2 = new C();
// Using multi-dispatch this would print "B,C"... but because C++ only
// uses single-dispatch it will print out "A,A"
CallMyFn(arg1, arg2);
+1 para el código que indica claramente el problema – neuro
Gracias, esta respuesta es más o menos lo que necesitaba ver.Ahora solo tengo que averiguar, ¿por qué demonios alguien necesita tal cosa? De todos modos, gracias por el buen ejemplo. – Martin
una aplicación es física, un cubo colisionando con otro cubo es una intersección, un cubo colisionando con un avión es una intersección diferente. Por lo tanto, terminas con bastantes diferentes métodos de detección de colisiones, y el envío es bastante útil para eso. Aquí hay un hilo en el despacho doble, http://www.gamedev.net/topic/453624-double-dispatch-in-c/ – QuantumKarl
envío múltiple es cuando la función que se ejecuta depende del tipo de tiempo de ejecución de más de un objeto.
C++ tiene despacho único porque cuando se usan funciones virtuales, la función real que se ejecuta depende solo del tipo de tiempo de ejecución del objeto a la izquierda de -> o. operador.
Estoy luchando por pensar en un caso de programación real para despacho múltiple. Tal vez en un juego donde varios personajes luchan entre sí.
void Fight(Opponent& opponent1, Opponent& opponent2);
El ganador de una pelea puede depender de las características de los dos oponentes, por lo que es posible que desee este llamado a despachar a uno de los siguientes, dependiendo de los tipos de tiempo de ejecución de ambos argumentos:
void Fight(Elephant& elephant, Mouse& mouse)
{
mouse.Scare(elephant);
}
void Fight(Ninja& ninja, Mouse& mouse)
{
ninja.KarateChop(mouse);
}
void Fight(Cat& cat, Mouse& mouse)
{
cat.Catch(mouse);
}
void Fight(Ninja& ninja, Elephant& elephant)
{
elephant.Trample(ninja);
}
// Etc.
Lo que hace la función depende de los tipos de ambos argumentos, no solo uno. En C++, puede que tenga que escribir esto como algunas funciones virtuales. Se seleccionaría una función virtual según un argumento (este puntero). Entonces, la función virtual puede necesitar contener un interruptor o algo para hacer algo particular al otro argumento.
En único despacho la función ejecutada depende solo del tipo de objeto. En despacho doble la función ejecutada depende del tipo de objeto y del parámetro .
En el siguiente ejemplo, la función Area()
se invoca usando única expedición, y Intersect()
basa en doble envío, ya que toma un parámetro Shape.
class Circle;
class Rectangle;
class Shape
{
virtual double Area() = 0; // Single dispatch
// ...
virtual double Intersect(const Shape& s) = 0; // double dispatch, take a Shape argument
virtual double Intersect(const Circle& s) = 0;
virtual double Intersect(const Rectangle& s) = 0;
};
struct Circle : public Shape
{
virtual double Area() { return /* pi*r*r */; }
virtual double Intersect(const Shape& s);
{ return s.Intersect(*this) ; }
virtual double Intersect(const Circle& s);
{ /*circle-circle*/ }
virtual double Intersect(const Rectangle& s);
{ /*circle-rectangle*/ }
};
El ejemplo se basa en este article.
ver este artículo escrito por B. BS: Open Multi-Methods for C++
aunque di un +1, se suponía que debías poner un resumen para ese artículo ... También el artículo cubre solo el reemplazo del método, no todos los casos de envío múltiple. –
- 1. Sobrecarga en Java y despacho múltiple
- 2. Use invookedynamic para implementar despacho múltiple
- 3. ¿Despacho doble en C#?
- 4. Despacho doble/multimétodos en C++
- 5. ¿C es un único envío o un idioma de despacho múltiple?
- 6. Despacho funciones
- 7. Despacho MouseEvent
- 8. Herencia múltiple en C#
- 9. C# herencia múltiple
- 10. C++ herencia múltiple Pregunta
- 11. C++ herencia múltiple fundición
- 12. C getopt valor múltiple
- 13. Despacho de eventos JDI nullpointerexception
- 14. mesa virtual/mesa de despacho
- 15. problema de herencia múltiple en C#
- 16. cómo simular la herencia múltiple en C#
- 17. declaración de espacio múltiple en C++
- 18. Regresión Lineal Múltiple Eficiente en C#/.Net
- 19. Interfaz vs Herencia Múltiple En C#
- 20. Pregunta sobre la herencia múltiple en C++?
- 21. Dilema de herencia múltiple en C++
- 22. Herencia múltiple de Objective-C
- 23. C++ ¿Herencia múltiple con interfaces?
- 24. C# opciones de envío múltiple?
- 25. C# Incremento múltiple sin rosca
- 26. C# coincidencia de cadena múltiple
- 27. Java despacho método con un argumento nulo
- 28. ¿Despacho dinámico de funciones de plantilla?
- 29. Android - Despacho de clave Tiempo de espera
- 30. Despacho de eventos personalizados con Dojo framework
C++ no lo soporta directamente, pero estoy seguro de que de alguna manera puede emular esto. Nunca he usado MD o incluso vi un diseño agradable en otros idiomas que me hizo querer tener MD en C++. Los fanáticos de Dylan lo enumeran como una de las características del lenguaje de Dylan. Pero hasta donde sé, huele como un mal diseño porque la cantidad de funciones que deberías escribir crece exponencialmente. No me gustaría escribir tantas funciones. – sellibitze
Has usado MD en cualquier momento que hayas usado el patrón 'Visitor'. –
Un ejemplo simple usando C++ 11: http://ideone.com/lTsc7M – Jarod42