给定以下代码,是否应该打印Calling B而不是Calling Aa的运行时类型不是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有两件事:

  • 防止这样的简单错误(编译器是您最好的 friend )
  • 使代码更易于理解(“哦,所以此功能将覆盖某些内容”)
  • 关于c++ - 虚拟分配运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31423632/

    10-10 07:25