Statischer Polymorphismus mit CRTP: Verwenden der Basisklasse zum Aufrufen abgeleiteter Methoden

Einer der Hauptvorteile vonvirtual In C ++ kann die Basisklasse (Zeiger oder Referenz) zum Aufrufen abgeleiteter Methoden verwendet werden.

Ich lese weiterVerwenden von CRTP zur Implementierung des statischen Polymorphismus, aber ich kann nicht verstehen, wie ich mit dieser Technik das erreichen kann, was ich oben erwähnt habe, weil ich eine Funktion nicht als Typ deklarieren kannBase wenn dies eine Vorlage erfordert.

Es scheint mir, dass das, was in dem Artikel beschrieben wird, durch einfaches Überladen von Funktionen erreicht werden könnte, daher bin ich mir sicher, dass es bei dieser Technik mehr geben muss.

(PS: Auf dieses genaue Problem wird in einem Kommentar zu einer Antwort auf angedeutetdiese Frage, aber leider hatte niemand geantwortet: "Was vtables wirklich bereitstellt, ist die Verwendung der Basisklasse (Zeiger oder Referenz) zum Aufrufen abgeleiteter Methoden. Sie sollten hier zeigen, wie es mit CRTP gemacht wird.")

Hier ist mein minimaler Code, der den Fehler "Fehlende Vorlagenargumente vor" & "Token void Print (Base & Object)" ausgibt.

#include <cstring>
#include <iostream>

template <typename Derived>
struct Base
{
    std::string ToStringInterface() { return static_cast<Derived*>(this)->ToString(); }

    std::string ToString()  {   return "This is Base.";     }
};

struct Derived : Base<Derived>
{
    std::string ToString()  {   return "This is Derived.";  }
};

void Print(Base& Object)
{
    std::cout << Object->ToStringInterface() << std::endl;
}

int main()
{
    Derived MyDerived;

    // This works, but could have been achieved with a function overload.
    std::cout << MyDerived.ToStringInterface() << std::endl;

    // This does not work.
    Print(MyDerived);
}