跨多个图层的模板化类未知类型

Templated class unknown type over multiple layers

本文关键字:未知 类型 图层      更新时间:2023-10-16

我有以下类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 这样的工作?

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

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