多层上的模板化 class 未知类型

Templated class unknown type over multiple layers

我有以下 class 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>();

相当标准。现在的问题是:我想把同样的事情提升到一个新的水平。

所以我得到了 class:

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

当然可以使用:

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

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

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

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

所以我可以执行以下操作:

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

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

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

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>();