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

Subclass B Inherits From a Template Class A<B>

本文关键字:lt gt 继承 子类      更新时间:2023-10-16

我最近偶然发现了这样的代码,我无法理解:

template<typename T>
class A
{
}
class B: A<B>
{
}

所以我的一般问题是:

  • 为什么这不会产生编译错误如果B还没有定义,那么类B如何从模板类A<B>继承
  • 何时需要这种结构

功能之一:此模板模式可以帮助您避免使用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();

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