0

我有一个基础容器类,它有许多运算符(=、+、-、+= 等)。预计派生类不需要更改运算符的逻辑。因此,理想情况下,我希望对其所有派生类使用基类运算符,而不必为每个派生类显式地重新定义它们(赋值运算符除外)。

下面基于一个简单的示例演示了我提出的解决方案。该解决方案似乎有效,但我对该方法对更复杂情况的有效性表示怀疑。您认为在 B 类中使用此作业“hack”是否有效?这种方法的潜在缺陷是什么?有什么我错过的吗?是否有更简单的方法来实现我需要的功能(即对派生类使用基类运算符)?

class A
{
 protected:
 int a;
 public:
 A(int ca)
 {
  a=ca;
 }
 A(const A& A1)
 {
  a=A1.a;
 }

 int geta() const
 {
  return a;
 } 
 void seta(int ca)
 {
  a=ca;
 }  
 const A& operator=(const A& A1)
 {
  a=A1.a;
  return *this;
 }

};

const A operator+(const A& A1, const A& A2)
{
 A myA(A1.geta()+A2.geta());
 return myA;
}

class B: public A
{
 public:
 B(int a): A(a) {}// ... using A::A;
 const B& operator=(const B& B1)
 {
  a=B1.geta();
  return *this;
 }
 const B& operator=(const A& B1)
 {
  a=B1.geta();
  return *this;
 }

};

int main()
{

 B myB(4);
 A myA(3);

 //need this to work
 myB=myB+myB;
 cout << myB.geta();
 myA=myA+myA;
 cout << myA.geta();

 int j;
 cin >>  j; 

}

4

2 回答 2

0

对于给出的示例,我看不到任何可能发生的问题。当然,您可以改进代码,首先通过在 operator= 中返回非 const 引用,其次我认为通过将 += op 添加到您的类中,并在全局 operator+ 函数中使用它的代码。

但总的来说,我认为它应该可以正常工作。至于赋值运算符——只要你只有 POD 类型而没有指针、引用或句柄,你就不需要任何。然而,当指针出现时,它会变得更加复杂。您需要确保复制对象、它们所指向的对象或以其他方式管理它们。

只要您不向派生类添加更多成员,您可能不需要修改运算符,这些成员也应该参与计算。

于 2013-07-09T12:46:07.703 回答
0

通常,您不必为派生类重新定义基类中的函数。通过公共继承,您的派生类将可以访问这些函数并很好地使用它们的操作。如果您确实想重新定义它们(例如 = 运算符),请确保调用正确的(在这种情况下,虚拟函数会有所帮助)。

于 2013-07-09T12:46:52.763 回答