簡體   English   中英

多層的模板類未知類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM