【问题标题】:why does setting a reference of a struct equal to another struct only change one data member?为什么设置一个结构的引用等于另一个结构只会改变一个数据成员?
【发布时间】:2020-10-25 04:54:53
【问题描述】:

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

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;
}

【问题讨论】:

  • 您分配给Ab2 对象的子对象。 b1 隐式转换为 A,因为左侧的类型是 A。也就是说,赋值等价于a_ref = (A&amp;)b1;
  • 延伸阅读:What is object slicing?

标签: c++ inheritance struct


【解决方案1】:

当你这样做时:

A& a_ref = b2; 

引用a_ref 仅引用从A 继承的B 的成员。毕竟A&amp; 无法知道派生类的成员。

所以当你这样做时:

a_ref = b1;

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

在这种情况下:

b2 = b1;

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

【讨论】:

    【解决方案2】:

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

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

    这就是说,你可以定义一个虚拟副本赋值运算符,它会做你所期望的......或者可能不会!

    我被愚弄了,以为你可以,但你真的不能......看 virtual assignment operator C++ 知道为什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多