有人可以向我解释为什么在类声明的末尾添加一个虚函数可以避免二进制不兼容吗?
如果我有:
class A
{
public:
virtual ~A();
virtual void someFuncA() = 0;
virtual void someFuncB() = 0;
virtual void other1() = 0;
private:
int someVal;
};
稍后将这个类声明修改为:
class A
{
public:
virtual ~A();
virtual void someFuncA() = 0;
virtual void someFuncB() = 0;
virtual void someFuncC() = 0;
virtual void other1() = 0;
private:
int someVal;
};
我从另一个根据先前声明编译的 .so 得到一个核心转储。但是,如果我将 someFuncC() 放在类声明的末尾(在“int someVal”之后):
class A
{
public:
virtual ~A();
virtual void someFuncA() = 0;
virtual void someFuncB() = 0;
virtual void other1() = 0;
private:
int someVal;
public:
virtual void someFuncC() = 0;
};
我再也看不到核心转储了。有人能告诉我这是为什么吗?这个技巧总是有效吗?
PS。编译器是 gcc,这适用于其他编译器吗?