多层上的模板化 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>();
我有以下 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>();