在下面的代码中,我了解到结构d中的赋值操作符不是在derived1 = derived2;
上调用的,而是生成和调用默认赋值运算符。然而,我不明白为何:
为什么在derived1 = derived2;
中隐式向上转换时不调用显式d赋值运算符?
--我猜是--默认的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"
}
发布于 2020-08-02 05:38:29
你的猜测基本上是正确的。编译器将合成一个定义为
void operator=(const d&)
对于派生类d
。(除非它没有被合成,因为它是显式的delete
d,或者某些特殊的成员函数是用户定义的)。
这个默认的operator=
具有这样的行为:它将对参数执行一个成员级的副本,并调用其基类的operator=
。在本例中,该操作符打印"base",这就是您所看到的输出。
https://stackoverflow.com/questions/63216626
复制相似问题