Hier ist etwas, was ich oft mache, es ist nicht schön, aber es ist einfach und nützlich.
ich oft mit Schablonen Containern arbeiten, die eine Schnittstelle zu implementieren, vorstellen so etwas wie
template<class T>
class MyVector : public ContainerInterface
...
Wo ContainerInterface Grund nützliche Sachen, aber das ist alles. Wenn ich einen speziellen Algorithmus für Vektoren von ganzen Zahlen haben möchte, ohne meine Template-Implementierung freizugeben, ist es nützlich, die Interface-Objekte zu akzeptieren und sie in der Implementierung auf MyVector herunterzufahren. Beispiel:
// function prototype (public API, in the header file)
void ProcessVector(ContainerInterface& vecIfce);
// function implementation (private, in the .cpp file)
void ProcessVector(ContainerInterface& vecIfce)
{
MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce);
// the cast throws bad_cast in case of error but you could use a
// more complex method to choose which low-level implementation
// to use, basically rolling by hand your own polymorphism.
// Process a vector of integers
...
}
Ich könnte einen Prozess() -Methode zum ContainerInterface hinzufügen, die polymorph aufgelöst werden würden, wäre es eine schöne OOP Methode sein, aber ich manchmal bevorzuge es auf diese Weise zu tun. Wenn Sie einfache Container und viele Algorithmen haben und Ihre Implementierung verborgen bleiben möchten, bietet dynamic_cast eine einfache und hässliche Lösung.
Sie könnten auch Doppelversandtechniken betrachten.
HTH
Der Titel dieser Frage stimmt nicht genau mit der Beschreibung überein. – bradtgmurray