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;
。进一步阅读: