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

4

我最近遇到了这样的代码,但是我无法理解它:

template<typename T>
class A
{
}

class B: A<B>
{
}

我的一般问题是:

  • 为什么这不会导致编译错误? 具体来说,如果B尚未定义,那么如何让类B继承模板类A<B>
  • 这种结构什么时候会有必要?

4
C++不使用一遍编译器。在代码中引用稍后定义的内容是完全合法的。 - Robert Harvey
4
这被称为“奇妙递归模板模式”。 - RichieHindle
3
http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern - Remy Lebeau
@Remy Lebeau 谢谢!看起来是一些有趣的阅读材料! - flakes
1
为什么这不会产生编译错误?除非模板在实例化点处需要该参数成为完整类型,否则不需要模板参数是一个完整类型。 - Oktalist
1个回答

3

其中一个特点:该模板模式可以帮助您避免使用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();

这样可以避免虚函数调用。可以通过这种方式进行一些性能优化...


但现在A对象不能被强制转换为Item指针来与B对象分组,你为什么还需要虚拟调用呢? - flakes
@Calpratt 如果类组合层次结构在编译时是固定的,那么这可能会有所帮助。我认为在这种情况下分组是不可用的。 - k06a
@Calpratt 这个具体的例子更好:https://dev59.com/Um855IYBdhLWcg3wvXDd#26718782 - k06a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接