Я думаю, вы запутались в «Справочнике против Пойнтера». Осознайте, что ваш код на самом деле делает .
A& ref = a; // Reference
ref = b;
После первой строки ref
и a
- это два имени для одного и того же объекта . Эффективный тип ref
равен A
.
.
Во второй строке объект b
назначается объекту, на который ссылается ref
(что, конечно, a
). Теперь у вас есть
- оригинал
b
и
-
A
-часть b
, скопированная в объект a
(и на которую ссылается ref
).
После копирования любая "B
-ность" скопированного объекта полностью теряется вместе с предыдущим содержимым объекта a
. Элемент _a
скопирован, элемент _b
и таблица B
отделены.
Попробуйте вместо этого:
int main()
{
B b (1,2);
A a (5);
A * ref = &a; // pointer, not reference
ref = &b;
ref->f();
return 0;
}
Это дает "2", как вы, вероятно, ожидали. Он также не перезаписывает объект a
, как в первом примере.