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