C.67:A多型クラスはコピー抑えるべきである(C.67:多型クラスは阻害をコピーしなければなりません)
理由(理由)
多型クラスは、クラスことを定義または継承少なくとも一つの仮想関数です。多型の挙動と他の派生クラスの基本クラスとして使用される可能性があります。それは誤った値によって渡された場合は、暗黙的に生成されたコピーコンストラクタと代入して、我々はスライスリスク:派生オブジェクトの唯一のベース部分がコピーされ、多形挙動が破損します。
ポリモーフィッククラスは、継承されたか、または定義された少なくとも一つの仮想関数。これは、多形挙動を継承有する別の派生クラスのベースクラスとして使用することができます。それは誤って暗黙のコピーコンストラクタと代入演算子によって生成された値として渡された場合、このような階層構造のリスクは次のようになりますのみ派生クラスのベース部分がコピーされるの多形挙動の完全性それは破壊されます。
例えば、悪い(陰性試料)
class B { // BAD: polymorphic base class doesn't suppress copying
public:
virtual char m() { return 'B'; }
// ... nothing about copy operations, so uses default ...
};
class D : public B {
public:
char m() override { return 'D'; }
// ...
};
void f(B& b) {
auto b2 = b; // oops, slices the object; b2.m() will return 'B'
}
D d;
f(d);
実施例(実施例)
class B { // GOOD: polymorphic class suppresses copying
public:
B(const B&) = delete;
B& operator=(const B&) = delete;
virtual char m() { return 'B'; }
// ...
};
class D : public B {
public:
char m() override { return 'D'; }
// ...
};
void f(B& b) {
auto b2 = b; // ok, compiler will detect inadvertent copying, and protest
}
D d;
f(d);
=削除に使用されるコードは、C ++ 11で導入された新機能で、次の資料の特定の作者を参照してください。
https://mp.weixin.qq.com/s/5yMBZWlKN_7OWhaJD4u_XQ
Note(注意)
C.130を参照してください:あなたは、多型のオブジェクト、使用クローン()関数の詳細コピーを作成する必要がある場合。
ディープコピーあなたはマルチステートオブジェクトを実装する必要がある場合は、クローン機能を使用し、C.130を参照してください
例外(例外)
例外オブジェクトを表すクラスは両方が多型とコピー構築可能である必要があります。
特徴的な多型とコピーを持っているオブジェクトの必要性の優れたパフォーマンスクラス。
施行(提案)
-
国旗非削除されたコピー操作で多型クラス。
-
何のコピー操作を示唆していないポリモーフィッククラスが宣言=削除されています。
-
旗多型クラスオブジェクトの割り当て。ヒント多型クラス割り当て。
説明リンク
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c67-a-polymorphic-class-should-suppress-copying
私はこの記事は参考になりましだと思いますか?ようこそ親指アップし、より多くの人と共有することができます。
より多くの更新の記事を読む、オブジェクト指向の考え方のマイクロチャンネル公衆数にしてください注意を払います[]