Pregunta

Tengo una biblioteca que puede compilarse como una biblioteca compartida (o DLL en Windows). Tiene una clase que se deriva de otra clase en otra biblioteca. La clase base tiene algunos métodos virtuales y mi clase anula algunos de ellos. Por ejemplo:

class Base {
public:
    virtual void method1();
    virtual void method2();
    virtual void method3();
};

class Derived: public Base {
public:
    virtual void method2();
};

Ahora descubrí que uno de los métodos virtuales no funciona para mi clase. Actualmente no anula este método, por lo que quiero anularlo también para solucionar su comportamiento:

class Derived: public Base {
public:
    virtual void method2();
    virtual void method3();
};

¿Break esta compatibilidad binaria con versiones más antiguas de mi biblioteca?

Hasta donde lo entiendo, es diferente de solo agregar funciones virtuales, ya que el número y el orden de los métodos virtuales en el VTable se mantienen igual. La única diferencia es que una entrada particular en el VTable para mi clase ahora contendrá un valor diferente. ¿Es esto correcto?

También estoy bastante seguro de que ninguna de las aplicaciones que usan actualmente mi biblioteca usa ese método, ya que está completamente roto y nunca funciona. Por lo tanto, no me preocupa romper las llamadas existentes a la implementación del método base. Solo quiero asegurarme de no romper nada más.

¿Fue útil?

Solución

Como estás hablando de DLL, supongo que se trata de C ++ en Visual Studio/Windows. Agregar la anulación no romperá la compatibilidad binaria porque el tamaño del VTable no está cambiando. Sin embargo, puede causar algunos resultados no deseados si no vuelve a compilar todo el código que instancias de nuevas instancias de derivado. Esto se debe a que el VTable se inicializa mediante la fuente instanciación, no la fuente de la clase que implementa derivada.

Otros consejos

Si entendí correctamente, tiene su clase base en DLL1 y su clase derivada en DLL2. Si este es el caso, el cambio que describe no afecta a DLL1. Suponiendo que instalará un DLL2 actualizado que su aplicación cambiará a la llamada derivada :: Method3 () siempre que acceda a instancias de punteros derivados o referencias a la base.

La biblioteca su clase derivada (que agregó el nuevo método virtual) existe en Will no necesariamente sea binario (ABI) compatible con la versión anterior de la biblioteca. Esto se debe a que no tiene control sobre cómo el compilador genera el VTable cuando agrega el método virtual anulado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top