C++ 子类B继承自模板类a<;B>;

C++ 子类B继承自模板类a<;B>;,c++,templates,inheritance,metaprogramming,C++,Templates,Inheritance,Metaprogramming,我最近偶然发现了类似这样的代码,我无法理解: template<typename T> class A { } class B: A<B> { } 模板 甲级 { } B类:A { } 因此,我的一般问题是: 为什么这不会给出编译错误?如果B尚未定义,类B如何从模板类a继承 什么时候需要这种结构? 其中一个功能:此模板模式可以帮助您避免使用vtable。这就是所谓的“静态多态性”—— 假设您有以下代码结构: class Item { public: vi

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

template<typename T>
class A
{
}

class B: A<B>
{
}
模板
甲级
{
}
B类:A
{
}

因此,我的一般问题是:

  • 为什么这不会给出编译错误?如果
    B
    尚未定义,类
    B
    如何从模板类
    a
    继承
  • 什么时候需要这种结构?

其中一个功能:此模板模式可以帮助您避免使用
vtable
。这就是所谓的“静态多态性”——

假设您有以下代码结构:

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();
模板
类项目{
公众:
void func(){
T::func();
}
}
A类:公共物品{
// …
}
乙类:公共物品{
// …
}
Item*Item=newa();
item->func();

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

C++不使用单次编译器。引用代码中进一步定义的内容是完全合法的。这被称为“奇怪的重复模板模式”。@Remy Lebeau谢谢!看起来像是一些有趣的阅读材料!“为什么不给出编译错误?”模板参数不要求是完整类型,除非模板使用参数的方式要求它在实例化时是一个完整的类型。但是既然
a
对象不能通过将它们转换为
Item
指针来与
B
对象分组,那么为什么还需要虚拟调用呢?@Calpratt如果类组合层次结构在编译时是固定的。我认为在这种情况下分组是不可用的。@Calpratt这个具体的例子更好: