现在,我知道向非叶类添加新的虚函数通常是不好的,因为它破坏了任何尚未重新编译的派生类的二进制兼容性。但是,我的情况略有不同:
我有一个接口类和实现类编译成一个共享库,例如:
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;
...
}
并重新编译我的共享库而无需重新编译应用程序?
如果是这样,我需要注意任何不寻常的警告吗?如果没有,除了获取命中和升级库之外,我是否还有其他选择,从而破坏了向后兼容性?