在下面的代码中,我知道结构d中的赋值运算符不是在derived1=derived2;
上调用的,而是生成和调用默认的赋值运算符。 然而,我不明白为什么:
当b&code>中隐式向上转播时,为什么不对
?derived1=derived2
调用显式d赋值运算符 base2=derived1
我的猜测是,默认的operator=
(with headervoid 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”,这就是您所看到的输出。