将CRTP与抽象类继承一起使用是否正确? 使用CRTP(好奇的重复模板模式)和C++中抽象类的继承是正确的吗?如果是,是否存在与此构造相关的任何潜在问题?下面给出的代码片段描述了我的问题 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与抽象类继承一起使用是否正确? 使用CRTP(好奇的重复模板模式)和C++中抽象类的继承是正确的吗?如果是,是否存在与此构造相关的任何潜在问题?下面给出的代码片段描述了我的问题 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 { };,c++,inheritance,crtp,C++,Inheritance,Crtp,就术语而言,具有抽象类基的问题与CRTP垂直,因为CRTP使用静态多态性描述继承,而AbstractBase提供动态多态性 如果不需要类型擦除,动态多态性可以被静态多态性替换。CRTP在编译时模拟虚拟函数调用系统,没有大小或函数调用开销方面的成本,没有可能的UB或UB(由于内存操作而损坏的vtable)引起的奇怪代码故障,缺点是无法在运行时做出此选择。CRTP生成的类可能具有标准内存布局 这里没有问题,只要混凝土类保持良好的结构。class AbstractBase可能用于类型擦除和作为公共接口

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

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

这里没有问题,只要混凝土类保持良好的结构。
class AbstractBase
可能用于类型擦除和作为公共接口,而
class Base
class a
可能是某些组件功能的一个单元本地实现。

1)看起来不错,因为
T
实现了
method\u 01
。2) 如果您已经定义了
Base_01
Base_02
类模板,看起来也可以。
class A : public Base_01<A>, public Base_02<A> {

};