CRTP:编译时多态与委托模式的应用
1. 编译时多态概述
CRTP(Curiously Recurring Template Pattern)允许我们用派生类的函数覆盖基类的函数,从而实现多态行为。与传统的运行时多态不同,CRTP的多态是在编译时实现的。
以下是一个简单的示例,展示了如何使用CRTP让派生类定制基类的行为:
template <typename D> class B {
public:
...
void f(int i) { static_cast<D*>(this)->f(i); }
protected:
int i_;
};
class D : public B<D> {
public:
void f(int i) { i_ += i; }
};
在这个例子中,如果调用基类的 B::f() 方法,它会将调用转发到派生类的对应方法,就像虚函数一样。不过,为了充分利用这种多态性,我们需要能够通过基类指针调用基类的方法。
下面是调用示例:
D* d = ...; // 获取一个D类型的对象
d->f(5);
B<D>* b = ...; // 也必须是一个D类型的对象
b->f(5);
这里的函数调用看起来和虚函数调用类似,但有一个显著的区别:派生类的实际类型 D 必须在编译时已知
超级会员免费看
订阅专栏 解锁全文
164

被折叠的 条评论
为什么被折叠?



