Статический полиморфизм с CRTP: использование базового класса для вызова производных методов

Одно из главных преимуществvirtual в C ++ имеет возможность использовать базовый класс (указатель или ссылку) для вызова производных методов.

Я читаю наиспользование CRTP для реализации статического полиморфизма, но я не могу понять, как добиться того, что я упомянул выше, используя эту технику, потому что я не могу объявить функцию как принимающую типBase когда это требует шаблона.

Мне кажется, что то, что описано в статье, может быть достигнуто простым использованием перегрузки функций, поэтому я уверен, что в этой технике должно быть что-то еще.

(PS: эта точная проблема упоминается в комментарии к ответу наэтот вопрос, но, к сожалению, никто не ответил на это: «Что действительно предоставляет vtables, так это использование базового класса (указатель или ссылка) для вызова производных методов. Вы должны показать, как это делается с CRTP здесь».)

Вот мой минимальный код, который выдает ошибку «пропущены аргументы шаблона перед символом« & »void Print (Base & Object)».

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

Ответы на вопрос(3)

Ваш ответ на вопрос