Ora, so che non è generalmente opportuno aggiungere nuove funzioni virtuali alle classi non foglia in quanto interrompe la compatibilità binaria per tutte le classi derivate che non sono state ricompilate. Tuttavia, ho una situazione un po 'diversa:Pure funzioni virtuali e compatibilità binaria
devo una classe di classe di interfaccia e l'implementazione compilato in una libreria condivisa, ad esempio:
class Interface {
public:
static Interface* giveMeImplPtr();
...
virtual void Foo(uint16_t arg) = 0;
...
}
class Impl {
public:
...
void Foo(uint16_t arg);
....
}
La mia domanda principale utilizza questa libreria condivisa, e potrebbe essere sostanzialmente scritto come:
Interface* foo = Implementation::giveMeImplPtr();
foo->Foo(0xff);
In altre parole, l'applicazione non ha alcuna classi che derivano da Interface
, si limita lo utilizza.
Ora, dire che voglio sovraccaricare Foo(uint16_t arg)
con Foo(uint32_t arg)
, io sono sicuro di fare:
class Interface {
public:
static Interface* giveMeImplPtr();
...
virtual void Foo(uint16_t arg) = 0;
virtual void Foo(uint32_t arg) = 0;
...
}
e ricompilare la mia libreria condivisa senza dover ricompilare l'applicazione?
In tal caso, sono presenti avvertenze inusuali di cui ho bisogno di essere a conoscenza? In caso contrario, ho altre opzioni oltre a prendere la versione hit e up della libreria, rompendo così la compatibilità all'indietro?