Ich verstehe, dass dynamische/statische Polymorphie hängt von der Anwendung Design und Anforderungen ab. Ist es jedoch ratsam, IMMER statischen Polymorphismus über Dynamik zu wählen, wenn möglich? Insbesondere kann ich die folgenden zwei Design-Wahl in meiner Anwendung sehen, von denen beide scheinen gegen beraten werden:Dyamic gegen statische Polymorphie in C++: Was ist vorzuziehen?
Implementieren Static Polymorphismus CRTP mit: No VTable Overhead-Lookup, während immer noch eine Schnittstelle in Form von Vorlage bereitstellt Basisklasse. Aber, verwendet eine Menge Schalter und static_cast die richtige Klasse/Methode zuzugreifen, die gefährlich ist
Dynamische Polymorphism: Schnittstellen implementieren (rein virtuellen Klassen), Lookup-Kosten assoziieren noch triviale Funktionen wie Accessoren/Mutatoren
Meine Anwendung ist sehr zeitkritisch, deshalb bin ich für statische Polymorphie. Aber müssen Sie wissen, ob die Verwendung zu vieler static_cast ein Hinweis auf schlechtes Design ist und wie Sie dies ohne Latenz vermeiden können.
EDIT: Danke für die Einsicht. In einem konkreten Fall, welcher davon ist ein besserer Ansatz?
class IMessage_Type_1
{
virtual long getQuantity() =0;
...
}
class Message_Type_1_Impl: public IMessage_Type_1
{
long getQuantity() { return _qty;}
...
}
ODER
template <class T>
class TMessage_Type_1
{
long getQuantity() { return static_cast<T*>(this)->getQuantity(); }
...
}
class Message_Type_1_Impl: public TMessage_Type_1<Message_Type_1_Impl>
{
long getQuantity() { return _qty; }
...
}
Hinweis, dass es mehr Mutatoren/Accessoren in jeder Klasse, und ich brauche eine Schnittstelle in meiner Anwendung zu spezifizieren. Bei statischem Polymorphismus wechsle ich nur einmal - um den Nachrichtentyp zu erhalten. Im dynamischen Polymorphismus verwende ich jedoch virtuelle Funktionen für den JEDEN Methodenaufruf. Ist es nicht ein Fall, statische Poly zu verwenden? Ich glaube, static_cast in CRTP ist ziemlich sicher und keine Leistungseinbußen (kompilierzeitgebunden)?
Eine Switch-Case-Struktur hat die gleiche Komplexität wie die Verwendung einer Vtable. – user877329
Ich bin mir nicht sicher, warum du denkst, dass du bei statischen Polymorphismen viele statische_Schaltungen und Schalter hast - kannst du einen Beispielcode zeigen? –
@MichaelAnderson: Sie werden das bekommen, wenn Sie versuchen, statischen Polymorphismus in einer Situation zu verwenden, die dynamischen Polymorphismus erfordert. In diesem Fall ist es fast sicher besser, dynamischen Polymorphismus zu verwenden, anstatt ihn neu zu erfinden. –