我遇到了以下问题,这些问题向我证明,我对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=
虚拟化。 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/