我有一个基类 A 和两个派生类 B 和 C。 B 定义了 = 运算符,将基类 A 作为参数。
在类 B 上调用 = 时,有时会调用基类 A 的运算符而不是 B 中的运算符。
class A {
public:
void operator=(A &) {
printf("A =\n");
};
};
class B : public A {
public:
void operator=(A &s) {
printf("B =\n");
};
};
class C : public A {
};
int main()
{
B b1, b2;
C c;
b1 = b2;
b1 = c;
}
输出是:
A =
B =
当我看到这一点时,我感到非常惊讶。我注意到它只是因为我删除了 A 类中的 operator=() ("operator=() = delete"),导致编译器错误。
最佳答案
您的 B::operator=
不是复制赋值运算符。除了您提供的,还有一个隐式定义的复制赋值运算符,它等效于
B& operator=(const B& other) {
A::operator=(other);
return *this;
}
此运算符不打印任何内容,但它调用基类上的赋值,并且打印
A=
.b1 = b2
调用此复制赋值运算符。 b1 = c
电话B::operator=(A&)
自 C
不是 B
.如果您希望您的运算符被调用,请使用上面显示的签名定义一个复制赋值运算符,而不是其他重载,或者除了其他重载之外。
关于c++ - C++ 中 operator= 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61292016/