Одним из основных преимуществ virtual
в C++ является возможность использовать базовый класс (указатель или ссылку) для вызова производных методов.
Я читаю об использовании CRTP для реализации статического полиморфизма, но не могу понять, как чтобы достичь того, что я упомянул выше, используя эту технику, потому что я не могу объявить функцию, принимающую тип Base
, когда для этого требуется шаблон.
Мне кажется, что то, что описано в статье, можно было бы достичь, просто используя перегрузку функций, поэтому я уверен, что в этой технике должно быть нечто большее.
(PS: именно эта проблема упоминается в комментарии к ответу на этот вопрос, но, к сожалению, никто не ответил на него: "Виртуальные таблицы действительно обеспечивают использование базового класса (указателя или ссылки) для вызова производных методов. Вы должны показать, как это делается с помощью 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);
}
Print
должна быть шаблоном функции для статического полиморфизма, да, что-то вродеtemplate<class Derived> void Print(Base<Derived>& Object);
. Статический полиморфизм разрешается во время компиляции, поэтомуPrint
должен точно знать, какую функцию вызывать во время компиляции. - person dyp   schedule 11.06.2014