![](/img/trans.png)
[英]Passing templated class with unknown type to untemplated class constructor
[英]Templated class unknown type over multiple layers
我有以下Foo和FooBase类:
class FooBase
{
public:
virtual void A() = 0;
};
template <class T>
class Foo : public FooBase
{
public:
virtual void A() {}
private:
T mT;
};
FooBase
在这里有一个实例,不需要知道类型,所以我可以做某事。 像这样:
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>();
由于明显的原因,这是行不通的-现在的问题是:如何获得某事。 像这样工作吗?
您可以使用虚拟继承解决此问题。 此功能可确保在实例化子类时,虚拟继承的基类只有一个实例。 以您的示例为例:
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>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.