Я верю, что ваше понимание верно. Простое изменение тела функции-члена не меняет объем пространства, требуемого для экземпляра этого объекта. Код не хранится «в» экземпляре объекта; только данные.
Когда класс компилируется, ссылки на поля данных элемента просто смещаются от начала данных этого объекта. А данные производных классов обычно помещаются после данных базового класса. Поэтому, если вы добавите поле в базовый класс, все правильные смещения для данных производного класса будут изменены, что означает, что базовый класс нуждается в перекомпиляции, чтобы указывать на новые (правильные) смещения.
До
class Foo {
int a; // offset 0 (assuming no vtable)
}
class Bar : public Foo {
int b; // offset 4
}
Bar bar; bar.b = 7; // sets the 32-bit value at this+4 to 7
* После 1013 *
class Foo {
int a; // offset 0
int c; // offset 4
}
class Bar : public Foo {
int b; // offset 8
}
Bar b; bar.b = 7; // Without recompiling: sets the 32-bit value at this+4
// which is actually where Foo.a is stored!
// With recompiling: sets the 32-bit value at this+8