首页 > 解决方案 > 将 CRTP 与抽象类继承一起使用是否正确?

问题描述

在 C++ 中使用 CRTP(Curiously 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> {

};

标签: c++inheritancecrtp

解决方案


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

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

只要具体的类保持良好的格式,这里就没有问题。它有可能class AbstractBase用于类型擦除和作为公共接口,同时class Baseclass A可能是某些组件功能的单元本地实现。


推荐阅读