2014-04-30 4 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

класс A - класс шаблонов. Поэтому, наследуя, B должен предоставить значение аргумента templae T, который в этом случае является «B». Но вы должны поставить определение класса A до B, иначе будет ошибка компиляции.

+1

Что не объясняет «почему», и это был вопрос. –

Смежные вопросы