gpt4 book ai didi

c++ - 虚拟赋值运算符

转载 作者:太空狗 更新时间:2023-10-29 20:23:47 27 4
gpt4 key购买 nike

给定下面的代码,是否应该打印 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com