【发布时间】:2021-09-05 09:09:35
【问题描述】:
我有一个抽象基类。有很多抽象类派生自这个抽象基类
#if ABI_VERSION_ATLEAST1
class Base
{
public:
virtual void food() =0
};
#endif
例如
#if ABI_VERSION_ATLEAST1
class Derived1: public Base
{
};
#endif
假设我想在不破坏二进制兼容性的情况下为其添加新方法。 唯一的办法就是扩展这个类
#if ABI_VERSION_ATLEAST2
class Base_Ext : public Base
{
public:
virtual void food1()=0;
};
#endif
问题是已经存在的派生类实现将无法访问这个 food1()。 怎么解决这个问题 抽象派生类怎么能看到这个新方法
我想到的一个解决方案是:-
我需要扩展 Derived1.......
#if ABI_VERSION_ATLEAST2
class Derived2 : public Derived1, public Base_Ex
{
} ;
#endif
再次在这里解决钻石问题,我将不得不改变
class Derived1: public Base to
class Derived1: public virtual Base {}
我不想这样做..因为它会再次破坏现有派生类的二进制兼容性。所以坚持下去
【问题讨论】:
-
或者把
class Derived1: public Base改成class Derived1: public Base_Ext -
没有什么好的方法可以在不破坏二进制兼容性的情况下更改界面。这就是为什么它们通常被认为是不可变的,并且对接口的任何更改都需要完全创建新接口,而不是硬塞原始实现。
-
您要为哪些类型保留二进制兼容性?所有类型?就
Base? -
@drew dorman 所有类型
-
如果您的
Base_ext需要从Base继承,那么您的Base_ext可以从Base和'Base_new' 派生。这个Base_new将汇总您想与Base的孩子分享的新方法。也就是说,您的Derived_x继承自Derived1、Base和Base_new。
标签: c++ inheritance facade binary-compatibility