如何在两个子类之间正确实现赋值运算符

时间:2013-12-02 18:56:18

标签: c++ oop inheritance assignment-operator

假设我有一个抽象类Parent和类Child1Child2,它们都继承自它。 现在我需要在Child1Child2之间正确实现赋值运算符。

立即出现的问题是我无法定义表单的运算符

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 &) 

我无法实现,因为编译器不会让我定义一个抽象类,它是一个抽象类。

那么你如何正确地做到这一点?

1 个答案:

答案 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)
{
  // ...
};