純粋仮想メソッドを持つクラスまたは派生クラスのみでコピーコンストラクタ/ operator =を定義することは意味がありますか?抽象クラス、コピーコンストラクタ
4
A
答えて
5
通常のクラスのようです:特定の実装が必要な場合は、はい。
2
コピーする予定のオブジェクトであれば、それは良い考えです。それがそうでない時は、私のコメントを見てください。
仮想基本クラスが明示的に割り当てられ、コピーされる必要のあるリソース(バッファ、オペレーティングシステムオブジェクトなど)に依存する場合、コピーコンストラクタを定義すると、派生クラスごとに別々にさらに、これらの基本リソースが公開継承を使用してプライベートであった場合、あなたができなかったことです)。
例えば:
class Base {
public:
Base(const Base &);
virtual ~Base();
virtual void Method() = 0;
// etc...
private:
int *memberIntArray;
int length;
// etc...
};
class DerivedOne : public Base{
public:
DerivedOne(const DerivedOne &);
virtual ~DerivedOne();
virtual void Method();
// etc...
protected:
// data, etc...
};
class DerivedTwo : public Base{
public:
DerivedTwo(const DerivedTwo &);
virtual ~DerivedTwo();
virtual void Method();
// etc...
protected:
// data, etc...
};
///////////////////
Base::Base(const Base & other) {
this->length = other.length;
this->memberIntArray = new int[length];
memcpy(this->memberIntArray,other.memberIntArray,length);
}
//etc...
DerivedOne::DerivedOne(const DerivedOne & other)
: Base(other)
{
//etc...
}
DerivedTwo::DerivedTwo(const DerivedTwo & other)
: Base(other)
{
//etc...
}
0
はい、あなたがしなければなりません。
クラスのコピーコンストラクタ、コピー代入演算子、およびデストラクタの独自の実装ルールは、抽象クラスであっても適用されます。
また、あなたは、例えば、微妙に処理へのコピーが必要です何もしていない場合には、使用状況によって異なりRule of Three
0
を見てハンドルをコピーします。必要に応じて、派生クラスにコピーコンストラクタを定義する方がよいでしょう。
4
純粋な仮想メソッドしか持たず、データメンバーもない場合は、合成されたものは正常です(何もしません)。
にがある場合、他のクラスと同様に、独自のコピーコンストラクタを定義する必要があります。派生クラスは実際にそれとはあまり関係がありません。
コピーコンストラクタを使用して、=演算子をオーバーライドする必要があることを追加します。読みやすさが向上し、エラーが発生しにくくなりました。 – janhink
私は正直なところ、プライベート空のコピーコンストラクタと代入演算子をすべてに宣言する方が好きです。このように、私が何かを不適切にコピーしようとすると、コンパイラは不平を言う。私が本当に実際にコピー可能なオブジェクトを必要とする場合にのみ、私はそれを公開します。あなたはそれを読んで笑っているかもしれませんが、私がその練習を始めたときにどれくらいの問題が修正されたのか驚いています。 ;) – Nate