c++ - 为什么将一个结构体的引用设置为等于另一个结构体只会改变一个数据成员?

标签 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) : 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& a_ref = b2; 
引用 a_ref仅指B的成员继承自 A .安 A&毕竟不能知道派生类的成员。
所以当你这样做时:
a_ref = b1;
唯一复制到 a_ref 的成员是它知道的成员,只有foo .所以只有b2.foo变化。
在这种情况下:
b2 = b1;
您正在复制 B 的所有成员对象,所以所有成员都被改变了。

关于c++ - 为什么将一个结构体的引用设置为等于另一个结构体只会改变一个数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62732801/

相关文章:

c - 包含用不同类型定义的位域的结构的大小

c++ - OOP C++ - 错误,因为 A.h 包含 B.h,B.h 又包含 A.h

c++ - 在类中存储固定的已知数据(c++)

css - 我的类(class)拒绝将其规则应用于列表

c++ - 模板化嵌套 C++ 类可以继承其封闭类吗?

ios - 当用作函数中的参数时,结构值类型前面需要关键字 var

python - 没有 DLL 的 SWIG + Python

c++ - DirectX 11 和 FreeType

java - 创建对象时如何修复 "Error: Cannot find symbol"?

c - token 之间没有数据时解析文件