C++中的CRTP(Curiously Recurring Template Pattern,好奇遞歸模板模式)是一種模板編程技巧,它允許派生類通過基類的模板接口實現多態性。CRTP基類通過模板參數接收一個派生類的類型,從而可以在編譯時調用派生類的成員函數。以下是一個簡單的示例,展示了如何使用CRTP實現多態性:
#include <iostream>
// 基類模板
template <typename Derived>
class Base {
public:
void baseMethod() {
static_cast<Derived*>(this)->derivedMethod();
}
};
// 派生類1
class Derived1 : public Base<Derived1> {
public:
void derivedMethod() {
std::cout << "Derived1 method called" << std::endl;
}
};
// 派生類2
class Derived2 : public Base<Derived2> {
public:
void derivedMethod() {
std::cout << "Derived2 method called" << std::endl;
}
};
int main() {
Derived1 d1;
Derived2 d2;
Base<Derived1>& b1 = d1;
Base<Derived2>& b2 = d2;
b1.baseMethod(); // 輸出 "Derived1 method called"
b2.baseMethod(); // 輸出 "Derived2 method called"
return 0;
}
在這個示例中,我們定義了一個基類模板Base
,它接受一個派生類的類型作為模板參數。然后,我們在Base
類中定義了一個成員函數baseMethod
,它通過static_cast
將this
指針轉換為派生類的類型,并調用其derivedMethod
成員函數。這樣,當我們使用基類引用調用baseMethod
時,會根據實際對象的類型動態地調用相應的派生類成員函數,從而實現多態性。