簡體   English   中英

C ++純虛擬多重繼承?

[英]C++ pure virtual multiple inheritance?

我需要幫助實現使用接口的多重繼承...

存在具有許多功能的接口的現有代碼。 實例是使用工廠創建的。

class IBig
{
    // Lot of pure virtual functions
};

他的補充:

class CBig: public IBig
{
    // Implementation
}

我想在多個較小的接口中拆分接口,但它應該與現有代碼保持一段時間兼容。

以下是我嘗試做的一個示例:

class IBaseA
{
public:
    virtual void DoA() = 0;
};

class IBaseB
{
public:
    virtual void DoB() = 0;
};

// The same interface, now based on multiple smaller interfaces
class IBig : public IBaseA, public IBaseB
{
};

class CBaseA: public IBaseA
{
public:
    virtual void DoA()
    {
        printf("DoA\n");
    }
};

class CBaseB: public IBaseB
{
public:
    virtual void DoB()
    {
        printf("DoB\n");
    }
};

// Inherit from base classes where the implementation is, and from IBig as 
// the instance of CBig is returned as IBig.
class CBig: public CBaseA, public CBaseB, public IBig
{
};

這里的問題是CBig類不能實例化。 編譯器說DoA和DoB函數是純虛函數,即使它們是在CBaseA和CBaseB中實現的。 如果我不想再次實現這些函數,只需要調用基類的函數,該怎么辦?

注意:我知道設計是丑陋的,但這只是暫時的,直到可以更換大界面,並且....我想了解! ;-)

提前致謝 !

在這里你應該使用虛擬繼承 此功能可確保在實例化子類時,只有一個虛擬繼承的基類實例。 對於您的示例,這看起來像:

#include <cstdio>

class IBaseA
{
public:
    virtual void DoA() = 0;
};

class IBaseB
{
public:
    virtual void DoB() = 0;
};

// The same interface, now based on multiple smaller interfaces
class IBig : virtual public IBaseA,  virtual public IBaseB
//              ^                       ^
{
};

class CBaseA: virtual public IBaseA
//              ^
{
public:
    virtual void DoA()
    {
        printf("DoA\n");
    }
};

class CBaseB: virtual public IBaseB
//              ^
{
public:
    virtual void DoB()
    {
        printf("DoB\n");
    }
};

// Inherit from base classes where the implementation is, and from IBig as 
// the instance of CBig is returned as IBig.
class CBig: public CBaseA, public CBaseB, public IBig
{
};

int main()
{
    CBig cb;
}

上述變化確保不會有額外的聲明DoADoB創建的,當你繼承IBaseAIBaseB多次。

這被稱為死亡的致命鑽石(或簡稱鑽石問題)。 之所以發生這種情況,是因為CBig繼承自共享公共基類的類。

您可以通過為其所屬的類添加前綴來調用正確的DoA

CBaseA::doA();

或者您使用虛擬繼承只有一個IBaseA和IBaseB實例

class CBaseA : public virtual IBaseA {};
class CBaseB : public virtual IBaseB {};
class IBig : public virtual IBaseA, public virtual IBaseB {};

等等...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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