关于c ++:子类B继承自模板类A

Subclass B Inherits From a Template Class A<B>

本问题已经有最佳答案,请猛点这里访问。

我最近偶然发现了类似这样的代码,我无法将我的头绕在上面:

1
2
3
4
5
6
7
8
template<typename T>
class A
{
}

class B: A
{
}

所以我的一般问题是:

  • 为什么不给出编译错误?具体来说,如果B还没有定义,那么类B如何继承模板类A呢?
  • 什么时候需要这种结构?


其中一个特性:这个模板模式可以帮助您避免使用vtable。这就是所谓的"静态多态性"——http://en.m.wikipedia.org/wiki/cur奇地重复出现的模板模式

假设您有这个代码结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Item {
public:
    virtual void func() = 0;
}

class A : public Item {
// …
}

class B : public Item {
// …
}

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

它可以替换为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename T>
class Item {
public:
    void func() {
        T::func();
    }
}

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

class B : public Item {
// …
}

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

这样可以避免虚拟函数调用。这可以做一些性能改进…