将CRTP与抽象类继承一起使用正确吗



在C++中使用CRTP(奇怪的递归模板模式(和抽象类的继承正确吗?如果是,是否存在与此构造相关的任何潜在问题?下面给出的代码片段描述了我的问题。

template<class T>
class Base {
void method_01() {
static_cast<T*>(this)->method_01();
}
};
class AbstractBase {
virtual void method_02() = 0;
};
class A : public Base<A>, public AbstractBase {
};

有没有可能用CRTP替换抽象类继承,使A类以类似的双重方式使用CRTP

class A : public Base_01<A>, public Base_02<A> {
};

就术语而言,具有抽象基类的问题垂直于CRTP,因为CRTP用静态多态性描述继承,而AbstractBase提供动态多态性。

如果不需要类型擦除,动态多态性可以用静态多态性代替。CRTP在编译时模拟虚拟函数调用系统,没有大小或函数调用开销的成本,没有可能的UB或UB(由于内存操作而损坏的vtable(导致的奇怪代码故障,缺点是无法在运行时做出此选择。CRTP生成的类可能具有标准内存布局。

这里没有问题,只要混凝土等级保持良好的形式。class AbstractBase可能用于类型的擦除公共接口,而class Baseclass A将是某些组件功能的单元本地实现。

最新更新