C++ 为什么将一个结构的引用设置为另一个结构只会更改一个数据成员?

C++ 为什么将一个结构的引用设置为另一个结构只会更改一个数据成员?,c++,inheritance,struct,C++,Inheritance,Struct,当我尝试这个代码时 我得到的输出是 1 1 | 1 2 但是,如果我去掉了引用,即 // replace A& a_ref = b2; a_ref = b1; // with b2 = b1; 输出更改为 1 1 | 1 1 我找不到任何网站解释为什么会发生这种情况。有人能解释一下吗 #include <iostream> struct A { int foo; }; struct B : public A { int bar; B(int x,int y

当我尝试这个代码时 我得到的输出是

1 1 | 1 2
但是,如果我去掉了引用,即

// replace 
A& a_ref = b2;  
a_ref = b1;
// with 
b2 = b1;
输出更改为

1 1 | 1 1
我找不到任何网站解释为什么会发生这种情况。有人能解释一下吗

#include <iostream>
struct A {
 int foo;
};
struct B : public A {
 int bar;
 B(int x,int y) : bar(y) { this->foo=x; }
};
int main(void) {
 B b1(1,1), b2(2,2);
 A& a_ref = b2;
 a_ref = b1;
 std::cout << b1.foo << ' ' << b1.bar << " | " << b2.foo << ' ' <<
b2.bar << '\n';
 return 0;
}
#包括
结构A{
int foo;
};
结构B:公共A{
int-bar;
B(intx,inty):条(y){this->foo=x;}
};
内部主(空){
b1(1,1),b2(2,2);
A&A_ref=b2;
a_ref=b1;
std::cout当您执行以下操作时:

A& a_ref = b2; 
a_ref = b1;
引用
a\u ref
仅指从
a
继承的
B
的成员。
a&
毕竟不知道派生类的成员

所以当你这样做的时候:

A& a_ref = b2; 
a_ref = b1;
复制到
a_ref
的唯一成员是它所知道的成员,这只是
foo
。因此只有
b2.foo
发生了变化

在这种情况下:

b2 = b1;

您正在复制
B
对象的所有成员,因此所有成员都将被更改。

您正在使用
a
引用,它可以绑定到任何派生类型(对于指针,同样的解释也适用)。编译器允许将其绑定到任何对象,以便您可以忘记其确切类型,无论是
A
B
,只要它继承自
A
。 显然,它不知道任何派生类型的内部结构,这就是为什么它只做
A
事情的原因

这可以使用虚拟函数来处理;在这种情况下,编译器负责放置一个表,其中包含指向真实函数的指针(不仅仅是基类型中的函数)。由于这些函数共享其签名,调用方可以调用其中任何一个函数,而不必关心其中发生了什么

这就是说,您可以定义一个虚拟拷贝分配操作符,它将实现您所期望的功能…或者可能不会

我被愚弄了,以为你可以,但你真的看不到
了解原因。

您将赋值给
b2
对象的
子对象。
b1
隐式转换为
A
,因为左侧的类型是
A
。换句话说,赋值相当于
A_ref=(A&)b1;
。进一步阅读: