我接下来上课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.像这样工作?
答案 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>();