Теперь я знаю, что, как правило, плохо добавлять новые виртуальные функции в неклассические классы, поскольку он разбивает двоичную совместимость для любых производных классов, которые не были перекомпилированы. Тем не менее, у меня есть немного другая ситуация:Чистые виртуальные функции и двоичная совместимость
У меня есть класс и реализация интерфейса класс скомпилирован в общей библиотеку, например:
class Interface {
public:
static Interface* giveMeImplPtr();
...
virtual void Foo(uint16_t arg) = 0;
...
}
class Impl {
public:
...
void Foo(uint16_t arg);
....
}
Мое главное приложение использует эту общую библиотеку, и в основном могу быть записан как:
Interface* foo = Implementation::giveMeImplPtr();
foo->Foo(0xff);
другими словами, приложение не имеет каких-либо классов, которые вытекают из Interface
, он просто использует его.
Теперь, скажем, я хочу перегружать Foo(uint16_t arg)
с Foo(uint32_t arg)
, я безопасно:
class Interface {
public:
static Interface* giveMeImplPtr();
...
virtual void Foo(uint16_t arg) = 0;
virtual void Foo(uint32_t arg) = 0;
...
}
и перекомпилировать общую библиотеку без необходимости перекомпилировать приложение?
Если да, то есть ли какие-либо необычные оговорки, о которых я должен знать? Если нет, есть ли у меня какие-либо другие варианты, кроме как взять хитовую и обновленную версию библиотеки, тем самым нарушая обратную совместимость?