我遇到了以下问题,这些问题向我证明,我对C++的工作了解甚少。

我使用具有纯虚函数的基类

class Base
    ...

和类型的派生类
class Derived : public Base{
private:
  Foo* f1;
 ...

两者都实现了赋值运算符。除其他外,Derived的赋值运算符将复制f1中的数据。在我的代码中,我创建了两个新的Derived类实例
Base* d1 = new Derived();
Base* d2 = new Derived();

如果我现在打电话给赋值运算符
*d1 = *d2;

不会调用Derived的赋值运算符,并且不会复制f1中的数据!只有当我这样做
*dynamic_cast<Derived*>(d1) = *dynamic_cast<Derived*>(d2);

有人可以解释为什么赋值运算符不超载吗?

谢谢!

最佳答案

不看相关代码就很难说。这是一个有效的示例:

#include <iostream>

using namespace std;

class A {
  public:
    virtual A& operator=(A& a) {}
};

class B : public A {
  public:
    B& operator=(A& a) { cout << "B" << endl; }
};

int main() {
  A* foo = new B();
  A* bar = new B();
  *foo = *bar;
  return 0;
}

运行时将打印B

您可能做错的事情:
  • 您可能已经忘记了在基类中将operator=虚拟化。
  • 您可能已经给 child 的类operator=作了签名,比对父类的operator=的限制更严格,因此您实际上并没有覆盖父类的定义。例如,如果在上面的示例中将B& operator=(A& a) { cout << "B" << endl; }更改为B& operator=(B& a) { cout << "B" << endl; },它将不再打印B
  • 关于c++ - 在调用基类的指针时,赋值运算符是否不重载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3731604/

    10-15 00:22