子类B继承自模板类A <b> </b>

时间:2014-11-05 17:04:51

标签: c++ templates inheritance metaprogramming

我最近偶然发现了看起来像这样的代码,我无法绕过它:

template<typename T>
class A
{
}

class B: A<B>
{
}

所以我的一般问题是:

  • 为什么这不会产生编译错误?具体来说,如果B甚至没有A<B>,那么类B如何从模板类{{1}}继承定义了吗?
  • 这种结构何时需要?

1 个答案:

答案 0 :(得分:2)

其中一项功能:此模板模式可以帮助您避免vtable使用。这称为“静态多态” - http://en.m.wikipedia.org/wiki/Curiously_recurring_template_pattern

假设您有这样的代码结构:

class Item {
public:
    virtual void func() = 0;
}

class A : public Item {
// …
}

class B : public Item {
// …
}

Item *item = new A();
item->func();

可以替换为:

template<typename T>
class Item {
public:
    void func() {
        T::func();
    }
}

class A : public Item<A> {
// …
}

class B : public Item<B> {
// …
}

Item<A> *item = new A();
item->func();

这样可以避免虚函数调用。这样做可以提高性能......