![](/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.