gpt4 book ai didi

c++ - 将虚函数添加到类声明的末尾可以避免二进制不兼容?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:43 27 4
gpt4 key购买 nike

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

如果我有:

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;
};

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

附言。编译器是 gcc,这是否适用于其他编译器?

最佳答案

来自 another answer :

Whether this leads to a memory leak, wipes your hard disk, gets you pregnant, makes nasty Nasal Demons chasing you around your apartment, or lets everything work fine with no apparent problems, is undefined. It might be this way with one compiler, and change with another, change with a new compiler version, with each new compilation, with the moon phases, your mood, or depending on the number or neutrinos that passed through the processor on the last sunny afternoon. Or it might not.

All that, and an infinite amount of other possibilities are put into one term: Undefined behavior:

Just stay away from it.

如果您知道特定编译器版本如何实现其功能,您可能会使用它。或者你可能不会。或者你可能认为它有效,但它会坏掉,但前提是坐在电脑前的人只吃了酸奶。

您是否有任何理由希望它能正常工作?

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

关于c++ - 将虚函数添加到类声明的末尾可以避免二进制不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2859761/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com