Nik*_*hil 3 c++ polymorphism crtp
#include <iostream>
template <class Derived>
class Base
{
public:
void method1()
{
static_cast<Derived*>(this)->method1();
}
void method2()
{
static_cast<Derived*>(this)->method2();
}
};
class Derived1: public Base<Derived1>
{
public:
void method1()
{
std::cout << "Method 1 of Derived1 executed.\n";
}
};
int main(int argc, char *argv[])
{
Derived1 d1;
d1.method1();
d1.method2();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
跟进问题:如何使这种类型安全?也就是说,如果有人忘记实现method2,我希望编译器能够捕获它.我不希望它在运行时爆炸.
我认为这是有效的原因是,如果您实例化此代码:
void method2()
{
static_cast<Derived*>(this)->method2();
}
Run Code Online (Sandbox Code Playgroud)
这里Derived没有的实现method2()将主要是一个华而不实的自我递归调用.这里的原因是,Derived1确实存在一个被调用的成员函数method2,即从基类继承的成员函数.
我尝试运行这段代码,果然调用method2导致自我递归导致堆栈溢出.
通常,CRTP通过不使基类函数调用同名的派生类函数来避免这种情况.这样,如果派生类缺少特定函数,则调用会触发编译器错误.在您的情况下,这不会发生,因为函数本身可以从基类间接引用.
| 归档时间: |
|
| 查看次数: |
460 次 |
| 最近记录: |