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

why does setting a reference of a struct equal to another struct only change one data member?

本文关键字:结构 一个 数据成员 另一个 设置 引用 为什么      更新时间:2023-10-16

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

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仅引用从A继承的B的成员。毕竟,A&无法知道派生类的成员。

因此,当您这样做时:

a_ref = b1;

复制到a_ref的唯一成员是它知道的成员,这只是foo。所以只有b2.foo变化。

在这种情况下:

b2 = b1;

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

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

这可以使用虚函数来处理;在这种情况下,编译器负责放置一个带有指向实际函数(而不仅仅是基类型(的指针的表。由于这些函数共享其签名,因此调用方可以调用其中任何一个,而不关心内部发生的情况。

也就是说,您可以定义一个虚拟副本分配运算符,它将执行您的期望...或者也许不是!

我被愚弄了,以为你可以,但你真的不能......看 虚拟分配操作员C++知道原因。