古いクラスから新しいクラスを派生させようとしています。基本クラスの宣言は次のようになります。
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;
}
コンパイラ (Analog Devices の VisualDSP++ 5.0) はこれを気に入らなかった:
".\NewDriver.cpp", line 10: cc0293: error: indirect nonvirtual base
class is not allowed
CmdObject("NewDriver", (EYCmdObjectType)100, true),
これは理にかなっていたので、Plugin と CmdObject から直接継承することにしました。複数の継承のあいまいさの問題を回避するために (そう思ったので)、仮想継承を使用しました。
class NewDriver : public Driver, public virtual Plugin, public virtual CmdObject
しかし、NewDriver の仮想メソッドの実装で、Plugin* を受け取る Mgr::RegisterPlugin メソッドを呼び出そうとしたところ、次のようになりました。
".\NewDriver.cpp", line 89: cc0286: error: base class "Plugin" is
ambiguous
if (!m_pMgr->RegisterPlugin(this))
this ポインターはどのようにあいまいで、どうすれば解決できますか?
ありがとう、
――ポール