Dafür brauchst du "multiple dispatch" - bzw. genauer: "double dispatch".
C++ kann das von sich aus nicht, aber man kann es mit zwei normalen virtual Function Calls nachbilden:
bool intersect(OBB*,OBB*);
bool intersect(OBB*,BSphere*);
bool intersect(OBB*,AABB*);
bool intersect(BSphere*,BSphere*);
bool intersect(BSphere*,AABB*)
bool intersect(AABB*,AABB*);
class OBB;
class BSphere;
class AABB;
class BVolume {
...
virtual bool intersect(BVolume *opponent) = 0;
virtual bool intersect(OBB *opponent) = 0;
virtual bool intersect(BSphere *opponent) = 0;
virtual bool intersect(AABB *opponent) = 0;
}
inline bool intersect(BVolume* a, BVolume* b) {
return a->intersect(b); // Dispatch by type of first object (a)
}
class OBB : BVolume {
virtual bool intersect(BVolume *opponent) {
return opponent->intersect(this); // Dispatch by type of second object (opponent aka. b)
}
virtual bool intersect(OBB *opponent) {
return intersect(this, opponent); // Call suitable overload of free intersect() function
}
virtual bool intersect(BSphere *opponent) {
return intersect(this, opponent); // ...
}
virtual bool intersect(AABB *opponent) {
return intersect(this, opponent); // ...
}
}
class BSphere : BVolume {
virtual bool intersect(BVolume *opponent) {
return opponent->intersect(this); // Dispatch by type of second object (opponent aka. b)
}
virtual bool intersect(OBB *opponent) {
return intersect(opponent, this);
}
virtual bool intersect(BSphere *opponent) {
return intersect(this, opponent);
}
virtual bool intersect(AABB *opponent) {
return intersect(this, opponent);
}
}
class AABB : BVolume {
virtual bool intersect(BVolume *opponent) {
return opponent->intersect(this); // Dispatch by type of second object (opponent aka. b)
}
virtual bool intersect(OBB *opponent) {
return intersect(opponent, this);
}
virtual bool intersect(BSphere *opponent) {
return intersect(opponent, this);
}
virtual bool intersect(AABB *opponent) {
return intersect(this, opponent);
}
}
Das gewinnt jetzt keinen Schönheitswettbewerb, aber es funktioniert.
Könnte aber leicht sein dass du mit der Typ-Variable schneller bist. Die if-Kaskade könnte man durch ein Array mit Funktionszeigern ersetzen. Dann rechnest du einfach index = type1 * numberOfTypes + type2 und rufst darüber die passende Funktion auf. Das ist dann ein indirekter Aufruf statt zwei, also vermutlich ne Spur schneller.