c++ - 将 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> {
};
解决方案
就术语而言,具有抽象类基的问题与 CRTP 垂直,因为 CRTP 描述了具有静态多态性的继承,同时AbstractBase
提供了动态多态性。
如果不需要类型擦除,则可以用静态替换动态多态。CRTP 在编译时模拟虚函数调用系统,没有大小或函数调用开销的成本,没有可能的 UB 或由 UB 引起的奇怪代码故障(由于内存操作而损坏的 vtable),缺点是无法在运行。CRTP 生成的类可能具有标准的内存布局。
只要具体的类保持良好的格式,这里就没有问题。它有可能class AbstractBase
用于类型擦除和作为公共接口,同时class Base
也class A
可能是某些组件功能的单元本地实现。
推荐阅读
- javascript - 无源 iframe 可能会导致 SurveyMonkey 小部件出现问题
- python - jsonschema 检查密钥是否存在
- java - java.reflection:如何使用动态数量的 args 执行 method.invoke(clazz, varargs)?
- c# - TreeViewItem 展开事件
- java - 计算给定数字在给定数组中出现的次数(java)
- javascript - 检查是否为 csv 格式
- flutter - 如何在颤动中捕获异常?
- python - 使用无监督机器学习对图像进行聚类
- ios - Apple 快速映射连接起点和终点
- c++ - std::ifstream 初始值在未初始化时检查为真