多层的模板类未知类型

时间:2015-02-02 11:13:20

标签: c++ templates inheritance

我接下来上课Foo和FooBase:

class FooBase
{
public:
    virtual void A() = 0;
};

template <class T>
class Foo : public FooBase
{
public:
    virtual void A() {}
private:
    T mT;
};

FooBase这里有一个实例而不需要知道类型,所以我可以做s.th.像这样:

FooBase *foo = new Foo<int>();

非常标准。现在问题是:我希望将同样的事情带到下一个层次。

所以我上课了:

template <class T>
class Bar : public Foo<T>
{
public:
    virtual void B() {}
};

当然可以使用:

Bar<int> *bar = new Bar<int>();

除了我不知道模板类的类型。 所以最初的想法是做以下事情:

class BarBase : public FooBase
{
public:
    virtual void B() {}
};

template <class T>
class Bar : public BarBase, Foo<T>
{
};

所以我可以做到以下几点:

BarBase *bar = new Bar<int>();

由于显而易见的原因,这不起作用 - 现在的问题是:如何获得s.th.像这样工作?

1 个答案:

答案 0 :(得分:2)

您可以使用虚拟继承解决此问题。此功能可确保在实例化子类时,只有一个虚拟继承的基类实例。对于您的示例,这看起来像:

class FooBase
{
public:
    virtual void A() = 0;
};

template <class T>
class Foo : public virtual FooBase
//                   ^^
{
public:
    virtual void A() {}
private:
    T mT;
};

class BarBase : public virtual FooBase
//                      ^^
{
public:
    virtual void B() {}
};

template <class T>
class Bar : public BarBase, Foo<T>
{
};

现在您可以愉快地创建您想要的实例:

BarBase *bar = new Bar<int>();