[英]How to ensure that the assignment operator on a virtual base class is called only once?
[英]Why is base class' assignment operator called?
在下面的代码中,我了解到 struct d中的赋值运算符未在derived1 = derived2;
而是生成并调用默认赋值运算符。 但是我对为什么感到困惑:
为什么不在derived1 = derived2;
上调用显式d赋值运算符; 当向上转换隐含在b & base2 = derived1
?
我的猜测是默认的operator=
(with header void operator=(const derived& d)
)总是生成,除非用完全相同的 header 显式重载并且总是匹配由相同类型的两个变量组成的赋值。 我在正确的道路上吗?
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&)
对于派生的 class d
。 (除非它没有被合成,因为它是显式的delete
d,或者某些特殊的成员函数是用户定义的)。
这个默认的operator=
的行为是它将对参数进行成员复制,并调用其基类的operator=
。 在这种情况下,该运算符打印“base”,这就是您看到的 output。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.