c++ - 当调用基类的指针时,赋值运算符是否没有重载?

标签 c++ operator-overloading assignment-operator

我遇到了以下问题,这证明我对 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运行时。

你可能做错的事情:

  1. 你可能忘记制作operator=基类中的虚拟。
  2. 您可能已经给 child 上过课 operator=作为比 parent 的 operator= 更严格的签名,所以你实际上并没有覆盖 parent 的定义。例如,如果您更改 B& operator=(A& a) { cout << "B" << endl; }B& operator=(B& a) { cout << "B" << endl; }在上面的示例中,它将不再打印 B .

关于c++ - 当调用基类的指针时,赋值运算符是否没有重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3731604/

相关文章:

c++ - 使用 map 为类创建迭代器

c++ - 重载 + 运算符的继承

c++ - 我们需要 move 和复制作业吗

c++ - CoRegisterClassObject 返回错误( session 0?)

c++ - 复制二维 vector 的最佳方法是什么

python - 调用len时Python如何保证__len__的返回值是整数?

c++ - 何时重载按引用传递(左值和右值)优于按值传递?

haskell - Haskell 中的绑定(bind)与赋值

C++ 编译器找不到文件

c++ - 在指向不同类的指针的 vector 中找到一个类