C ++ ambiguous pointer resolution

I am trying to get a new class from the old. The base class declaration is as follows:

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;
};

Its constructor looks like this:

Driver::Driver() : 
    YCmdObject("Driver", (CmdObjectType)100, true),
    m_Engine("MyEngine")
{
    Services *m_pServices = NULL;
    Mgr *m_pMgr = NULL;
}

Therefore, when I created my derived class, I first tried just inheriting from the base class:

class NewDriver : public Driver

and copy the constructor:

NewDriver::NewDriver() : 
    CmdObject("NewDriver", (EYCmdObjectType)100, true),
    m_Engine("MyNewEngine")
{
    Services *m_pServices = NULL;
    Mgr *m_pMgr = NULL;
}

The compiler (VisualDSP ++ 5.0 from Analog Devices) did not like:

".\NewDriver.cpp", line 10: cc0293:  error: indirect nonvirtual base
      class is not allowed
 CmdObject("NewDriver", (EYCmdObjectType)100, true),

This made sense, so I decided to directly inherit from Plugin and CmdObject. To avoid inheritance ambiguity problems (as I thought), I used virtual inheritance:

class NewDriver : public Driver, public virtual Plugin, public virtual CmdObject

But then, when implementing the virtual method in NewDriver, I tried to call the Mgr :: RegisterPlugin method, which the plugin * accepts, and I got the following:

".\NewDriver.cpp", line 89: cc0286:  error: base class "Plugin" is
      ambiguous
 if (!m_pMgr->RegisterPlugin(this))

How is this pointer ambiguous and how to resolve it?

Thank,

- Paul

+3
7

Driver, Driver:

class NewDriver : public Driver { /* ... */ };
NewDriver::NewDriver() : Driver() {}

Driver , .
-, :

class Driver : /* ... */ {
public:
    Driver(const std::string& name /* , ... */)
      : CmdObject(name /* , ... */)
    {}
    // ...
};

NewDriver::NewDriver() : Driver("NewDriver" /* , ... */) {}
+4

, .

, ++.

+1

:

class A {public:  a(int i){} };
class B : public A {public:  b(){} };
class C : public B {public:  c(); };

A C

C::C() : A(5) {} // illegal

A B, , . , , .

, , , .

, , 2 Plugin 2 CmdObject NewDriver . , this NewDriver*, , Plugin*, , , , , NewDriver, . , , , . , , , , , .

+1

- . , . , Plugin virtual Driver

+1

, Virtual Inheritance - , . , , - CmdObject() ctor "" "". ctor Driver?

0

, . , . . , Driver . NewDriver, , - NewDriver, , . , , . .

class Driver : public Stuff
{
public:
    Driver(const char* enginename) : Stuff(99), m_Engine(enginename) { }

private:
   Engine m_Engine;
};

class NewDriver : public Driver
{
public:
   NewDriver() : Driver("New Driver!") { } // yes, Stuff gets initialized with 99 automatically!
};
0
source

CmdObjectinside Drivershould be enough. Customize Driverto have a constructor protectedthat can customize CmdObjectwithin specified limits.

class Driver ...
protected:
    Driver( std::string driverName, std::string engineName );

...

Driver::Driver( std::string driverName, std::string engineName ) :
    YCmdObject(driverName, (CmdObjectType)100, true),
    m_Engine(engineName) {

...

NewDriver::NewDriver() : 
    Driver( "NewDriver", "MyNewEngine" ) {
    ...
}
0
source

Source: https://habr.com/ru/post/1744860/


All Articles