1.CRTP的优势:
通常的继承关系中,多态是通过虚函数实现的,但虚函数会带来一些运行时开销,因为它们需要通过虚函数表(vtable)进行动态分派。而 CRTP使用模板基类来实现多态行为, 则是在编译时就确定了派生类的方法,因此可以避免这种开销。
2.CRTP的基本结构:
CRTP 的核心思想是,让一个类派生自一个将自己作为模板参数的基类。具体结构如下:
template <typename Derived>
class Base {
public:
void interface() {
// 基类可以调用派生类的方法
static_cast<Derived*>(this)->implementation();
}
};
class Derived : public Base<Derived> {
public:
void implementation() {
std::cout << "Derived implementation" << std::endl;
}
};
- 基类
Base
是一个模板类,它接受一个模板参数Derived
,该模板参数表示派生类。 - 派生类
Derived
继承自Base<Derived>
,将自身作为模板参数传递给基类。 - 基类中的方法(如
interface()
)可以通过static_cast<Derived*>(this)
将基类的指针转换为派生类的指针,从而调用派生类的实现方法(如implementation()
)。