【问题标题】:Is it correct to use the CRTP along with abstract class inheritance?将 CRTP 与抽象类继承一起使用是否正确?
【发布时间】:2021-06-16 18:12:30
【问题描述】:

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

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> {

};

【问题讨论】:

  • 1) 看起来不错,因为 T 实现了 method_01。 2) 看起来也不错,因为您已经定义了 Base_01Base_02 类模板。

标签: c++ inheritance crtp


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多