假设我有一个基类和一个派生类。我已经编译了我的程序并运行它。现在假设我想在我的基类中做一些改变。
我的问题是:
问题 1:如果我仅在基类文件中单独进行更改并仅重新编译基类,那么这些更改是否会反映在已经实例化的派生类对象中,或者我是否还需要重新编译派生类。问这个问题的其他方式可能是副本是创建到基类成员函数还是存储指针以便自动反映更改?
问题2:如果没有自动更新,那么有什么办法可以做到这一点??
假设我有一个基类和一个派生类。我已经编译了我的程序并运行它。现在假设我想在我的基类中做一些改变。
我的问题是:
问题 1:如果我仅在基类文件中单独进行更改并仅重新编译基类,那么这些更改是否会反映在已经实例化的派生类对象中,或者我是否还需要重新编译派生类。问这个问题的其他方式可能是副本是创建到基类成员函数还是存储指针以便自动反映更改?
问题2:如果没有自动更新,那么有什么办法可以做到这一点??
C++ 没有反射,所以你需要重新编译整个东西。
这不是由语言明确定义的(因为它不涉及动态链接),但我们可以列出一些可能有效的情况,而有些情况几乎肯定不会。
这些背后有几个假设:
如果第一个假设不成立,那么这个问题似乎毫无意义,因为无论如何您都必须重建整个库。
如果您更改或升级编译器,或更改编译器标志或您链接的任何其他库的版本,则第二个假设可能会被打破。
关于内联,如果不同的动态库内联了不同版本的代码,您可能会遇到非常微妙的错误。你真的不会喜欢尝试调试这些。
C++ 是一种静态编译语言。这意味着每次类型检查都是在编译时完成的,所以如果你修改了一个类型,那么依赖于修改的每一行代码都必须重新编译。它包括基类修改和子类,就像您的情况一样。
请注意,这可能是一个问题,因为如果您正在编写 API,并且修改了 API 实现,则必须重新编译 API 和使用您修改的代码(用户代码)的每个代码。
减少重新编译的经典技术是PIMPL 习惯用法。 PIMPL通过指向存储为原始类成员的实现类的指针隐藏类的实现。请注意,原始类仅充当接口。所以如果修改了实现,接口就没有了,所以类的用户不需要重新编译。