将 CRTP 与抽象类继承一起使用是否正确?

问题描述

在 C++ 中将 CRTP(CurIoUs Recurring Template Pattern)与抽象类的继承一起使用是否正确?如果是这样,是否存在与此构造相关的任何潜在问题?下面给出的代码片段描述了我的问题。

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 将是一个某些组件功能的单元本地实现。