在类声明的末尾添加虚函数可以避免二进制不兼容?

bob*_*bob 4 c++ gcc binary-compatibility

有人可以向我解释为什么在类声明的末尾添加一个虚函数可以避免二进制不兼容吗?

如果我有:

class A
{ 
  public:
    virtual ~A();
    virtual void someFuncA() = 0;
    virtual void someFuncB() = 0;
    virtual void other1() = 0;
  private:
    int someVal;
};
Run Code Online (Sandbox Code Playgroud)

然后将此类声明修改为:

class A
{ 
  public:
    virtual ~A();
    virtual void someFuncA() = 0;
    virtual void someFuncB() = 0;
    virtual void someFuncC() = 0;
    virtual void other1() = 0;
  private:
    int someVal;
};
Run Code Online (Sandbox Code Playgroud)

我得到了另一个coredump.所以根据之前的声明编译.但是如果我在类声明的末尾放置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;
};
Run Code Online (Sandbox Code Playgroud)

我再也看不到coredump了.有人能告诉我为什么会这样吗?这个技巧总能奏效吗?

PS.编译器是gcc,这与其他编译器一起工作吗?

sbi*_*sbi 6

另一个答案:

这是否会导致内存泄漏,擦拭你的硬盘,让你怀孕,让讨厌的鼻腔恶魔在你的公寓周围追你,或者让一切正常,没有明显的问题,是不确定的.它可能是这种方式与一个编译器,并改变另一个,改变与新的编译器版本,每个新的编译,与月相,你的心情,或取决于在最后一个阳光下通过处理器的数量或中微子下午.或者它可能不会.

所有这些,以及无限量的其他可能性都被置于一个术语中:未定义的行为:

只是远离它.

如果您知道特定编译器版本如何实现其功能,您可能会使其工作.或者你可能不会.或者你可能认为它有效,但它会中断,但只有坐在电脑前的人才会吃酸奶.

你还有什么理由想要这个吗?

我认为它的工作方式/工作方式不起作用/因为您的编译器按照声明虚函数的顺序创建虚拟表条目.如果你陷入困境放一个虚函数在其他人之间的顺序,那么当有人呼叫other1(),而不是someFuncC()被调用,可能与错的争论,但绝对在错误的时刻.(很高兴它会立即崩溃.)
然而,这只是一个猜测,即使它是正确的,除非你的gcc版本附带一个描述这个的文件,否则无法保证它明天将以这种方式工作即使相同的编译器版本.