如何从基class调用派生赋值运算符?
How to call derived assignment operator from base class?
给定一个指向抽象基 class A*
的指针,我想复制或分配它(作为基 class)并调用派生的复制构造函数或赋值运算符.我知道复制构造函数不能是虚拟的,所以大概复制构造函数不是执行此操作的选项,但赋值运算符是。仍然,它似乎不起作用:以下代码打印
assigned a
x!
destroyed b
destroyed b
未能分配 b.
#include <iostream>
using namespace std;
class A
{
public:
virtual void x()=0;
virtual ~A() {}
virtual A& operator=(const A& other) { cout << "assigned a" << endl; return *this;}
};
class B : public A
{
public:
virtual B& operator=(const B& other) { cout << "assigned b" << endl; return *this;}
virtual void x() { cout << "x!" << endl; }
virtual ~B() { cout << "destroyed b" << endl; }
};
int main()
{
A* a = new B();
A* aa = new B();
*aa=*a;
aa->x();
delete a;
delete aa;
return 0;
}
如何操作?
EDIT 这个问题在下面得到了正确的回答,但这是一个错误的问题。我不应该尝试覆盖赋值运算符,因为我不希望 A 的子 class 将 赋值给另一个 。有关更简单的答案(希望如此),请参阅
问题是您的 B::operator=
没有覆盖 A
中的那个。改成
virtual A& operator=(const A& other) { cout << "assigned b" << endl; return *this;}
它会起作用的。另外,在覆盖成员函数时尝试使用 override
关键字(需要 C++11)。如果您不覆盖,代码将无法编译。在你的情况下,它会发现你的错误
error: 'virtual B& B::operator=(const B&)' marked 'override', but does not override
PS:您可能在考虑 covariant return types。为了让它工作,你的函数的签名必须是相同的,除了 return 类型。例如,这将起作用:
virtual B& operator=(const A& other) { cout << "assigned b" << endl; return *this;}
给定一个指向抽象基 class A*
的指针,我想复制或分配它(作为基 class)并调用派生的复制构造函数或赋值运算符.我知道复制构造函数不能是虚拟的,所以大概复制构造函数不是执行此操作的选项,但赋值运算符是。仍然,它似乎不起作用:以下代码打印
assigned a
x!
destroyed b
destroyed b
未能分配 b.
#include <iostream>
using namespace std;
class A
{
public:
virtual void x()=0;
virtual ~A() {}
virtual A& operator=(const A& other) { cout << "assigned a" << endl; return *this;}
};
class B : public A
{
public:
virtual B& operator=(const B& other) { cout << "assigned b" << endl; return *this;}
virtual void x() { cout << "x!" << endl; }
virtual ~B() { cout << "destroyed b" << endl; }
};
int main()
{
A* a = new B();
A* aa = new B();
*aa=*a;
aa->x();
delete a;
delete aa;
return 0;
}
如何操作?
EDIT 这个问题在下面得到了正确的回答,但这是一个错误的问题。我不应该尝试覆盖赋值运算符,因为我不希望 A 的子 class 将 赋值给另一个 。有关更简单的答案(希望如此),请参阅
问题是您的 B::operator=
没有覆盖 A
中的那个。改成
virtual A& operator=(const A& other) { cout << "assigned b" << endl; return *this;}
它会起作用的。另外,在覆盖成员函数时尝试使用 override
关键字(需要 C++11)。如果您不覆盖,代码将无法编译。在你的情况下,它会发现你的错误
error: 'virtual B& B::operator=(const B&)' marked 'override', but does not override
PS:您可能在考虑 covariant return types。为了让它工作,你的函数的签名必须是相同的,除了 return 类型。例如,这将起作用:
virtual B& operator=(const A& other) { cout << "assigned b" << endl; return *this;}