2014-04-30 134 views
1

我有一个B类继承自类A,但我不明白为什么B类以这种方式声明。以下声明是什么意思?

class B : public A <B> 
{ 
public: 
    ... 
}; 

template <class T> 
class A 
{ 
public: 
     .... 
} 
+0

你的问题似乎是格式错误 – Massa

+8

你在问什么[CRTP](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)是什么? – PeterT

+1

我不知道CRTP是什么,为什么我们使用这种模式来声明类?谢谢! – Lei

回答

4

正如PeterT指出的那样,这是curiously recurring template pattern (CRTP)。 这是一种在C++中实现静态多态性的方法,因为基类A掌握子类B及其(内部)类型和状态的知识。

例如,A中的逻辑可以返回对动态多态性来说不可能的正确类型的对象。 CRTP允许将该逻辑移动到基类,动态多态性需要派生类中的虚函数来处理适合B的正确类型。

给出了更详细的解释here

0

class A是一个模板类。因此,当继承时,B必须为templae参数T提供价值,在这种情况下它是'B'。但是你必须在B之前放置A的类定义,否则会出现编译错误。

+1

这并不能解释“为什么”,那就是问题所在。 –