Статический полиморфизм с 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);
}