【发布时间】:2014-07-31 17:44:08
【问题描述】:
virtual 在 C++ 中的主要好处之一是能够使用基类(指针或引用)来调用派生方法。
我正在阅读using CRTP to implement static polymorphism,但我无法理解如何使用这种技术实现我上面提到的内容,因为当需要模板。
在我看来,文章中描述的内容可以通过简单地使用函数重载来实现,所以我相信这种技术肯定还有更多。
(PS:在对this question 的回答的评论中提到了这个确切的问题,但不幸的是没有人回复它:“vtables 真正提供的是使用基类(指针或引用)来调用派生方法。你应该在这里展示它是如何使用 CRTP 完成的。")
这是我的最小代码,它给出了错误“在‘&’标记之前缺少模板参数 无效打印(基础和对象)”。
#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);
}
【问题讨论】:
-
“因为当需要模板时,我不能将函数声明为采用 Base 类型。” 函数
Print必须是静态多态的函数模板,是的-- 类似template<class Derived> void Print(Base<Derived>& Object);。静态多态性在编译时解决,因此Print必须确切地知道在编译时调用哪个函数。
标签: c++ templates polymorphism crtp