3 ms·
The difference confused me for a bit, but consider the following: Print(Vehicle v){ print("vehicle"); } Print(Car c){ print("car"); } Print
by foota 9y ago
The difference confused me for a bit, but consider the following:
Print(Vehicle v){
print("vehicle");
}
Print(Car c){
print("car");
}
Print(Boat b){
print("boat");
}
Vehicle test = Boat();
Print(test);
In a language with multi dispatch I believe this prints boat, whereas with single dispatch it prints vehicle.
- lmitchell 9y agoNot quite. Multiple dispatch (as mentioned in sibling comments) is basically 'virtual on both object and argument types', so like: class Vehicle { virtual void Collide(Vehicle other); } class Car { void Collide(Truck other) { /* hit a truck */ } void Collide(Car other) { /* hit another car */ } } class Truck { void Collide(Truck other) { /* hit another truck */ } void Collide(Car other) { /* hit a car */ } } Vehicle c = Car(); Vehicle t = Truck(); c.Collide(t); // with multiple dispatch, calls Car::Collide(Truck)
- seanmcdirmid 9y agoYou are using static overloading on the argument rather than dynamic dispatch. If the static type of truck is obscured to a super class, your behavior won't be as expected. In general, overloading shouldn't be used as a replacement for dynamic dispatch, rather it should be used to accommodate multiple incompatible types (e.g. foo(X) and foo(Y) but never foo(Z) if X <: Z and Y <: Z unless foo(Z) maintains the behavior of foo(X) and foo(Y) given an x or a y under subsumption). Multiple dispatch is typically meant to be purely dynamic in meaning, as wiki puts it: > Multiple dispatch or multimethods is a feature of some programming languages in which a function or method can be dynamically dispatched based on the run-time (dynamic) type or, in the more general case some other attribute, of more than one of its arguments.[1] (https://en.wikipedia.org/wiki/Multiple_dispatch https://en.wikipedia.org/wiki/Multiple_dispatch)
- yorwba 9y agoThe static type of both c and t is Vehicle, but by dynamic multiple dispatch Car::Collide(Truck) is selected. That's not how C++ works, but the example was exactly about illustrating how C++ doesn't work.