Я ожидал, что он унаследует копию переменной-члена x
Нет, вы не наследуете при копировании.B
наследование A
приводит к тому, что каждый объект B
содержит подобъект типа A
.Поскольку x
определено в A
, вы модифицируете подобъект A
, присвоив x
.
Следующая переформулировка кода делает этот подобъект видимым:
#include <iostream>
using namespace std;
struct A {
int x;
A() { x = 10; }
};
struct B {
A subobject;
B(): subobject() { this->subobject.x = 0; }
};
int main() {
B* ab = new B;
cout << ab->subobject.x << endl; // prints 0
}
Это, конечно, не идентично наследованию, так как типы A
и B
теперь больше не связаны (вы не можете конвертировать из B
в A
), но это несколько аналогично тому, что компилятор видит, когдавы используете наследство.