gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:44 24 4
gpt4 key购买 nike

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

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