現在,我知道向非葉類添加新的虛函數通常是不好的,因爲它會破壞任何派生類的二進制兼容性,而這些類沒有被重新編譯。但是,我有一個稍微不同的情況:純虛函數和二進制兼容性
我編譯成一個共享庫的接口類和實現類,例如:
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;
...
}
,並重新編譯我的共享庫,而無需重新編譯應用程序?
如果是這樣,有什麼不尋常的注意事項我需要注意?如果沒有,除了使用命中和升級版本庫之外,還有其他選擇,從而打破向後兼容性嗎?