我試圖從舊的類中派生出新的類。基類的聲明看起來是這樣的:在C++中解析模糊的指針
class Driver : public Plugin, public CmdObject
{
protected:
Driver();
public:
static Driver* GetInstance();
virtual Engine& GetEngine();
public:
// Plugin methods...
virtual bool InitPlugin (Mgr* pMgr);
virtual bool Open();
virtual bool Close();
// CmdObject
virtual bool ExecObjCmd(uint16 cmdID, uint16 nbParams, CommandParam *pParams, CmdChannelError& error);
Mgr *m_pMgr;
protected:
Services *m_pServices;
Engine m_Engine;
};
它的構造是這樣的:
Driver::Driver() :
YCmdObject("Driver", (CmdObjectType)100, true),
m_Engine("MyEngine")
{
Services *m_pServices = NULL;
Mgr *m_pMgr = NULL;
}
所以,當我建立了我的派生類中,我第一次嘗試簡單地從基類繼承:
class NewDriver : public Driver
和複製構造函數:
NewDriver::NewDriver() :
CmdObject("NewDriver", (EYCmdObjectType)100, true),
m_Engine("MyNewEngine")
{
Services *m_pServices = NULL;
Mgr *m_pMgr = NULL;
}
編譯器(的VisualDSP ++ 5.0來自Analog Devices)不喜歡這樣的:
".\NewDriver.cpp", line 10: cc0293: error: indirect nonvirtual base
class is not allowed
CmdObject("NewDriver", (EYCmdObjectType)100, true),
這很有道理,所以我決定直接從插件和CmdObject繼承。爲了避免多重繼承歧義的問題(所以我認爲),我用虛擬繼承:
class NewDriver : public Driver, public virtual Plugin, public virtual CmdObject
但隨後,在NewDriver虛擬方法的實現,我試着撥打經理:: RegisterPlugin方法,它接受插件*,我得到了這個:
".\NewDriver.cpp", line 89: cc0286: error: base class "Plugin" is
ambiguous
if (!m_pMgr->RegisterPlugin(this))
這個指針是如何模糊的,我該如何解決它?
感謝,
--Paul
嚴格地說宣佈
virtual
,如果基類構造函數不帶任何參數,你甚至不需要把它在初始化列表,因爲它將被默認自動構造。 – 2010-05-11 00:24:59@dash,這並不完全準確(至少不用g ++)。幾乎繼承的類型將在非虛擬繼承類型之前初始化。因此,如果隱式順序(來自物理繼承層次)與物理順序之間的初始化順序不同,一些編譯器至少會開始發佈有關重新排列初始化順序的警告(即使您省略了初始化列表並允許編譯器做訂單本身)。 – 2010-05-11 00:35:21
我只是稍微改變了措辭,我不想在這裏找到所有其他可能的錯綜複雜。 – 2010-05-11 00:45:13