没有其他数据成员的继承

时间:2014-04-21 14:30:16

标签: c++ inheritance

考虑以下代码:

class Basic {
public:
   Basic() { ... }
   Basic(const Basic& other) { ... }
   virtual ~Basic() { ... }

   virtual void foo() = 0;
private:
   int x, y, z;
};

class DerivedA : public Basic {
public:
   DerivedA() :  { ... }
   virtual ~DerivedA() { ... }

   virtual void foo() { ... }
}

class DerivedB : public Basic {
public:
   DerivedB() { ... }
   virtual ~DerivedB() { ... }

   virtual void foo() { ... }
}

实际上,DerivedADerivedB类没有其他数据成员,它们唯一的目的是覆盖foo类中的纯虚拟Basic函数。

我想为operator=个类实现 copy-constructor Derived

我的计划是:

1)复制构造函数:

在Derived类中实现类似的复制构造函数:

DerivedA(const DerivedA& other) : Basic(other) {
   // Do nothing
}
DerivedB(const DerivedB& other) : Basic(other) {
   // Do nothing
}

2)作业 - 操作员:

Basic类实现交换:

void swap(Basic& other) {
  std::swap(x, other.x);
  std::swap(y, other.y);
  std::swap(z, other.z);
}

重载operator = for' Derived'课程:

DerivedA& operator=(const DerivedA& other) {
  Derived tmp(other);
  (*this).swap(tmp);
  return (*this);
} 

DerivedB

的情况相同

现在我的问题:这是一个好习惯吗?我应该为Derived类实现swap吗?有没有更好的方法在这种继承中实现这样的方法?我的架构是否足以得到其他人的良好支持?

p.s。抱歉我的英语。

1 个答案:

答案 0 :(得分:3)

让我提供一个替代建议:使用默认的复制构造函数和复制赋值运算符,让编译器为您完成工作!您的类没有任何浅层状态,因此默认版本将完全按照您的要求执行,并且更有可能由编译器正确生成,而不是错过复制粘贴,引入一个微妙的错误。 / p>