我有一个继承自A类的B类,但我不明白为什么B类以这种方式声明。
class B : public A <B>
{
public:
...
};
template <class T>
class A
{
public:
....
}
答案 0 :(得分:4)
正如PeterT已经指出的那样,这是curiously recurring template pattern (CRTP)。
这是一种在C ++中实现静态多态的方法,因为基类A
具有关于子类B
及其(内部)类型和状态的知识。
例如,A
中的逻辑可以返回正确类型的对象,这是动态多态无法实现的。 CRTP允许将该逻辑移动到基类,其中动态多态性需要派生类中的虚函数来处理适合B
的正确类型。
更详细的解释是here。
答案 1 :(得分:0)
A类是模板类。因此,在继承时,B必须为模板参数T提供值,在这种情况下,它是“B&#39;”。但是你必须在B之前放置A的类定义,否则会出现编译错误。