J'essaie de dériver une nouvelle classe à partir d'une ancienne classe. La déclaration de classe de base ressemble à ceci:Résolution de ce pointeur ambigu en 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;
};
Son constructeur ressemble à ceci:
Driver::Driver() :
YCmdObject("Driver", (CmdObjectType)100, true),
m_Engine("MyEngine")
{
Services *m_pServices = NULL;
Mgr *m_pMgr = NULL;
}
Alors, quand je crée ma classe dérivée, j'ai essayé d'hériter simplement de la classe de base:
class NewDriver : public Driver
et copier le constructeur:
NewDriver::NewDriver() :
CmdObject("NewDriver", (EYCmdObjectType)100, true),
m_Engine("MyNewEngine")
{
Services *m_pServices = NULL;
Mgr *m_pMgr = NULL;
}
Le compilateur (VisualDSP ++ 5.0 de Analog Devices) n'a pas aimé ceci:
".\NewDriver.cpp", line 10: cc0293: error: indirect nonvirtual base
class is not allowed
CmdObject("NewDriver", (EYCmdObjectType)100, true),
Cela fait sens, alors j'ai décidé d'hériter directement de plug-in et CmdObject. Pour éviter de multiples problèmes d'ambiguïté de l'héritage (donc je pensais), je l'héritage virtuel:
class NewDriver : public Driver, public virtual Plugin, public virtual CmdObject
Mais, dans la mise en œuvre d'une méthode virtuelle dans NewDriver, j'ai essayé d'appeler la méthode Mgr :: registerPlugin qui prend Plugin *, et j'ai obtenu ceci:
".\NewDriver.cpp", line 89: cc0286: error: base class "Plugin" is
ambiguous
if (!m_pMgr->RegisterPlugin(this))
Comment ce pointeur est-il ambigu et comment le résoudre?
Merci,
--Paul
Strictement parlant, si la classe de base ctor ne prend aucun paramètre, vous n'avez même pas besoin de le mettre dans le liste d'initialisation car il sera construit automatiquement par défaut. –
@dash, Ce n'est pas tout à fait exact (du moins pas avec g ++). Les types virtuellement hérités seront initialisés avant les types non-virtuellement hérités. Ainsi, si l'ordre d'initialisation diffère entre l'ordre implicite (de la hiérarchie d'héritage physique) et physique, certains compilateurs commenceront au moins à émettre des avertissements sur l'ordre d'initialisation réorganisé (même si vous omettez les listes d'initialisation et autorisez le compilateur à faire la commande elle-même). –
J'ai simplement légèrement modifié le libellé, je ne veux pas entrer dans toutes les autres intrications possibles ici. –