gpt4 book ai didi

c++ - 为什么调用基类的赋值运算符?

转载 作者:行者123 更新时间:2023-12-01 14:47:11 24 4
gpt4 key购买 nike

在下面的代码中,我知道在 derived1 = derived2; 上没有调用 struct d 中的赋值运算符而是生成并调用默认赋值运算符。
但是我很困惑为什么:
为什么不在 derived1 = derived2; 上调用显式 d 赋值运算符当向上转换隐含在 b & base2 = derived1 中时?
我的猜测 是默认 operator= (带有标题 void operator=(const derived& d) )总是生成,除非使用完全相同的标题显式重载,并且将始终与由相同类型的两个变量组成的赋值匹配。我在正确的道路上吗?

struct b {
int x;
void operator=(const b& base) {
std::cout << "base" << std::endl;
}
}

struct d: b {
int y;
void operator=(const b& base) {
std::cout << "derived" << std::endl;
}
}

int main() {
b base1;
d derived1;
d derived2;
b & base2 = derived1;

derived1 = base1; // output: "derived"
derived1 = derived2; // output "base"
}

最佳答案

你的猜测大部分是正确的。编译器会综合一个定义

void operator=(const d&)
对于派生类 d . (除非它没有被合成,因为它明确是 delete d,或者某些特殊的成员函数是用户定义的)。
这个默认 operator=有这样的行为,它将执行参数的成员拷贝,并调用 operator=它的基类。在这种情况下,该运算符打印“base”,这就是您看到的输出。

关于c++ - 为什么调用基类的赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63216626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com