考虑以下代码:
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() { ... }
}
实际上,DerivedA
和DerivedB
类没有其他数据成员,它们唯一的目的是覆盖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。抱歉我的英语。
答案 0 :(得分:3)
让我提供一个替代建议:使用默认的复制构造函数和复制赋值运算符,让编译器为您完成工作!您的类没有任何浅层状态,因此默认版本将完全按照您的要求执行,并且更有可能由编译器正确生成,而不是错过复制粘贴,引入一个微妙的错误。 / p>