我试图从旧的类中派生出新的类。基类的声明看起来是这样的:在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