[英]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;
}
上述變化確保不會有額外的聲明DoA
和DoB
創建的,當你繼承IBaseA
和IBaseB
多次。
這被稱為死亡的致命鑽石(或簡稱鑽石問題)。 之所以發生這種情況,是因為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.