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

标签 c++ inheritance 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 可以用于类型删除并作为公共(public)接口(interface),而class BaseA 类 将是某些组件功能的单元本地实现。

关于c++ - 将 CRTP 与抽象类继承一起使用是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66706420/

相关文章:

c# - 如何继承样式并覆盖某些内容?

c++ - 继承错误 - 无法实例化抽象类\无法访问类中声明的 protected 成员

c++ - Clang 和 Intel 无法编译此 CRTP 代码

c++ - 汇编/__asm 内联

用于读取复数的 C++ 正则表达式

c++ - QTableWidget中如何动态分配单元格

c++ - 向下转换指向成员函数的指针。这是合法的用法吗?

C++ CRTP 名称查找

c++ - 使用 CRTP 访问基类的 protected 成员

c++ - 当我使用 sdk 7.1 编译它时,我的对话框没有出现,