Herencia virtual y temido diamante.

Estoy teniendo dificultades con un problema de diamantes temido. Como recordatorio, aquí está la jerarquía de clases clásica de este problema:

<code>    B
   / \
 C1   C2
   \ /
    D
</code>

Para resolverlo, la solución estándar es hacer que C1 y C2 utilicen la herencia virtual para heredar de B.

Mi problema es que B y C1 son de un SDK que no puedo modificar. Ejemplo abajo donde no puedo hacerSubclase heredar virtualmente deBase. Clases: PureVirtualBase, Base y SubClassB son del SDK que uso. No puedo modificarlos. SubClassA y Leaf son mis clases personalizadas. Puedo cambiarlos

<code>     PureVirtualBase(SDK)
           |
        Base(SDK)
       /        \
 SubClassA   SubClassB(SDK)
       \        /
          Leaf
</code>

En tal situación dondeSubclase no se puede cambiar para usar la herencia virtual deBase. ¿Cómo se debe para que:

Hoja la instancia solo contiene unoBaseEvite la ambigüedad cuando intente acceder a funciones definidas puramente virtuales enPureVirtualBase e implementado enBase
<code>class PureVirtualBase
{
public:
    PureVirtualBase()
    {
        cout<<"<<PureVirtualBase::PureVirtualBase" << endl;
        cout<<">>PureVirtualBase::PureVirtualBase" << endl;
    }
    virtual int f_PureVirtualBase()=0;
};
class Base : public PureVirtualBase
{
public:
    Base(std::string id) {
        cout<<"<<Base::Base:"<<id << endl;
        m_id=id;
        cout<<">>Base::Base:"<<m_id << endl;
    }
    virtual int f_PureVirtualBase() {
       cout<<"Base::f_PureVirtualBase" << endl;
       return 1;
    }
private:
    std::string m_id;
};
class SubClassA:  public virtual Base
{
public:
    SubClassA(): Base("From SubClassA") {
        cout<<"<<SubClassA::SubClassA" << endl;
        cout<<">>SubClassA::SubClassA" << endl;
    }
};
class SubClassB:  public Base
{
public:
    SubClassB():Base("From SubClassB") {
        cout<<"<<SubClassB::SubClassB" << endl;
        cout<<">>SubClassB::SubClassB" << endl;
    }
};    
class Leaf:  public SubClassA, public SubClassB
{
public:
    Leaf():SubClassA(),  SubClassB(), Base("From Leaf") {
        cout << "<<Leaf::Leaf" << endl;
        cout << ">>Leaf::Leaf"<< endl;
    }
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Leaf myleaf;
    myleaf.f_PureVirtualBase();
    return a.exec();
}
</code>
Si comento la llamada a f_PurevirtualBase se compila pero tengo una advertencia de queBase virtual 'Base' inaccesible en 'Hoja' debido a la ambigüedad Si descomento esta llamada: me sale este error:solicitud de miembro 'f_PureVirtualBase' es ambiguaSi prefijo esta llamada por el nombre de la clase (myleaf.SubClassA :: f_PureVirtualBase (), entonces funciona, pero obviamente hay algo incorrecto ya que hay 2Base contenido en elHoja Objeto).

¿Alguna pista?

Más información para responder comentarios.

Mi arquitectura de destino es un poco más compleja que la muestra que proporcioné en la pregunta original:

<code> PureVirtualBase(SDK)
       |
     Base(SDK)
        |
        --SubClassA
        --SubClassB(SDK)
        --SubClassC(SDK)
        --SubClassD(SDK)
</code>

LeafOne: hereda de SubClassA y SubClassB (SDK)

LeafTwo: hereda de SubClassA y SubClassC (SDK)

LeafThree: hereda de SubClassA y SubClassD (SDK)

SubClassA es mi propio código privado. Proporciona funciones personalizadas. Debería poder tratarse como una instancia de Base mediante los métodos del SDK. Esta clase no se creará una instancia, pero está aquí para poder manejar LeafOne, LeafTwo y LeafThree de la misma manera cuando se realiza algún tratamiento.

Respuestas a la pregunta(2)

Su respuesta a la pregunta