我有一个基类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 =
为什么第一个分配不调用B :: operator =()?
为什么第二个赋值也不也调用A :: operator =(),因为它也是从A派生的?
我该怎么做才能使B :: operator =()每次都被调用?
看到这个,我感到非常惊讶。我注意到它只是因为我在A类中删除了operator =()(“ operator =()= delete”),导致编译器错误。
您B::operator=
不是副本分配操作员。除了您提供的一个,还有一个隐式定义的复制分配运算符,它等效于
B& operator=(const B& other) {
A::operator=(other);
return *this;
}
此运算符不输出任何内容,但会在基类上调用该赋值,然后执行print A=
。
b1 = b2
调用此副本分配运算符。b1 = c
来电B::operator=(A&)
以来C
,不是B
。
如果要调用运算符,请使用上面显示的签名定义一个复制分配运算符,以代替其他重载或在其他重载之外进行定义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句