给定以下代码,是否应该打印Calling B
而不是Calling A
? a
的运行时类型不是B
,因此虚拟调用应导致对B::operator=
的调用(因为虚拟调用由左操作数确定)?
#include <iostream>
class A
{
public:
virtual A& operator=(const A& a_) { std::cout << "Calling A" << std::endl; }
};
class B : public A
{
public:
virtual B& operator=(const B& b_) { std::cout << "Calling B" << std::endl; }
};
int main() {
B b1;
B b2;
A& a = b1;
a = b2; // Prints "Calling A", should be "Calling B"?
return 0;
}
最佳答案
a = b2;
是,而不是是虚拟调用。
这样做的原因是B::operator=(const B&)
不会覆盖A::operator=(const A&)
,因为它们的签名是不同的。
您可以使用override
来使编译器自动为您检查这些内容。
使用override
有两件事:
关于c++ - 虚拟分配运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31423632/