在 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 Base
和A 类
将是某些组件功能的单元本地实现。
关于c++ - 将 CRTP 与抽象类继承一起使用是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66706420/