父类引用指向子类对象
最近在进行开发的时候,看到了一个之前没有见过的写法,即父类的引用指向子类对象,指针指向子类对象之前经常见,引用确实少见,因此记录一下:
例如现在有如下代码示意:
1
2
3
4
Base tmp;
Son son;
Base& ref = son;
ref = tmp;
当执行ref = tmp之后,son对象会有什么变化呢?
在 C++ 中,赋值操作 ref = tmp; 会调用 Base 类的赋值运算符 operator=。这意味着赋值是发生在 Base 类的层面,而不是 Son 类。由于 ref 是对 Son 对象 son 的引用,这个赋值操作将 tmp 对象的值赋给了 son 对象的 Base 部分,但不会改变 son 对象中 Base 部分之外的数据。如果 Son 类有其他成员数据或状态,这些不会被 base 对象所影响。
测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct Base {
int a;
const char* s;
};
struct Son : public Base {
int t;
};
int main() {
Base tmp;
tmp.a = 20;
tmp.s = "tmp";
Son son;
son.a = 111;
son.s = "sss";
son.t = 222;
printf("before ref: [%d %s %d]\n", son.a, son.s, son.t);
Base& ref = son;
ref = tmp;
printf("after ref: [%d %s %d]\n", son.a, son.s, son.t);
return 0;
}
output:
1
2
before ref: [111 sss 222]
after ref: [20 tmp 222]
赋值操作对子类Son独有的成员变量t没有影响,只覆盖了从Base类继承过来的成员变量。
This post is licensed under CC BY 4.0 by the author.