Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果只将非虚拟、非重载成员函数添加到类中,用户是否需要重新编译?_C++ - Fatal编程技术网

C++ 如果只将非虚拟、非重载成员函数添加到类中,用户是否需要重新编译?

C++ 如果只将非虚拟、非重载成员函数添加到类中,用户是否需要重新编译?,c++,C++,这只是一个理论问题。我在COM世界遇到了类似的问题,并且怀疑这是否也适用于C++世界。我也知道我可以用Pimpl成语来避免这个问题 假设我有一个a级版本1。我将头文件和库文件发送给客户机 然后有一天,我通过添加一些函数(不是虚拟的,也不是重载的)更新了A。A类现在是版本2 假设版本2是在与版本1相同的环境和设置下编译的 我的理解是在新的库文件中,类A的大小和vtable将不会更改。此外,由于没有添加重载函数,因此客户端不会调用错误的函数。因此,用户无需重新编译其代码 这个假设有什么陷阱吗?我不知

这只是一个理论问题。我在COM世界遇到了类似的问题,并且怀疑这是否也适用于C++世界。我也知道我可以用Pimpl成语来避免这个问题

假设我有一个a级版本1。我将头文件和库文件发送给客户机

然后有一天,我通过添加一些函数(不是虚拟的,也不是重载的)更新了A。A类现在是版本2

假设版本2是在与版本1相同的环境和设置下编译的

我的理解是在新的库文件中,类A的大小和vtable将不会更改。此外,由于没有添加重载函数,因此客户端不会调用错误的函数。因此,用户无需重新编译其代码


这个假设有什么陷阱吗?

我不知道有什么陷阱。您描述的概念称为二进制兼容性

因为类A的版本2与类A的版本1仍然是二进制兼容的(据我所知),所以不需要重新编译。KDE Techbase文章提供了一套维护二进制兼容性的指南(附有示例)


除了显而易见的:这违反了ODR,这反过来意味着未定义的行为,可能没有什么错。。。但是,这并不能真正得到答案,因为它可能依赖于编译器和平台。我同意戴维的观点,回答这个问题的问题是二进制兼容性是依赖于实现的,它取决于使用的C++ ABI。因此,一般来说,C++的回答是“有C++的ABI,在任何地方,永远是不兼容的,还是在我回答的人和将来的人中使用这个答案?”这是一个很难回答的问题,无论任何人实现非虚拟函数的可能性有多大,而不仅仅是作为映射到函数的另一个符号。