假设我有一个抽象类Parent
和类Child1
和Child2
,它们都继承自它。
现在我需要在Child1
和Child2
之间正确实现赋值运算符。
立即出现的问题是我无法定义表单的运算符
Child1 operator=(const Child2 & rhs);
因为这要求在运算符定义点完全定义类Child2
,并且Child 2
中定义的运算符相同。
我尝试将运算符定义为
Child1 operator=(const Parent & rhs);
这似乎适用于大多数情况,但在以下情况下失败:
vector<Parent *> children;
children.push_back(new Child1());
children.push_back(new Child2());
(*children[1]) = *const_cast<const Parent *>(children[0]);
在这种情况下,编译器想要运行赋值运算符
Parent operator=(const Parent &)
我无法实现,因为编译器不会让我定义一个抽象类,它是一个抽象类。
那么你如何正确地做到这一点?
答案 0 :(得分:3)
这是单独的头文件和实现文件以及前向声明(后面是伪代码)的工作:
// parent.h
class Parent {};
// child1.h
class Child2; // forward declaration
class Child1 : public Parent
{
Child1& operator=(cosnt Child2& rhs);
};
// child2.h
class Child1; // forward declaration
class Child2 : public Parent
{
Child2& operator=(cosnt Child1& rhs);
};
// child1.cpp
#include "child1.h"
#include "child2.h"
Child1& Child1::operator=(cosnt Child2& rhs)
{
// ...
};
// child2.cpp
#include "child2.h"
#include "child1.h"
Child2& Child2::operator=(cosnt Child1& rhs)
{
// ...
};