Polimorfismo estático com CRTP: usando a classe base para chamar métodos derivados

Um dos principais benefícios devirtual em C ++ é capaz de usar a classe base (ponteiro ou referência) para chamar métodos derivados.

Eu estou lendousando CRTP para implementar polimorfismo estático, mas não consigo entender como alcançar o que mencionei acima usando essa técnica, porque não consigo declarar uma função como tendo o tipoBase quando isso requer um modelo.

Parece-me que o que está descrito no artigo pode ser alcançado usando simplesmente a sobrecarga de funções, por isso tenho certeza de que deve haver mais nessa técnica.

(PS: esse problema exato é mencionado em um comentário a uma resposta paraessa questão, mas infelizmente ninguém respondeu: "O que o vtables realmente fornece é usar a classe base (ponteiro ou referência) para chamar métodos derivados. Você deve mostrar como isso é feito com o CRTP aqui.")

Aqui está o meu código mínimo, que fornece o erro "falta de argumentos do modelo antes do token 'e' anula a impressão (base e objeto)".

#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);
}

questionAnswers(3)

yourAnswerToTheQuestion