From 334c902a134ef7444365477c0e87fc852111ab43 Mon Sep 17 00:00:00 2001 From: hsutter Date: Thu, 13 Dec 2018 11:34:49 -0800 Subject: [PATCH] Adding suggestion in #1283 comment thread Thanks, Mike! --- CppCoreGuidelines.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CppCoreGuidelines.md b/CppCoreGuidelines.md index bac1f40..a9771f1 100644 --- a/CppCoreGuidelines.md +++ b/CppCoreGuidelines.md @@ -12126,7 +12126,15 @@ In the rare cases where the slicing was deliberate the code can be surprising. class Circle : public Shape { /* ... */ Point c; int r; }; Circle c {{0, 0}, 42}; - Shape s {c}; // copy Shape part of Circle + Shape s {c}; // copy construct only the Shape part of Circle + s = c; // or copy assign only the Shape part of Circle + + void assign(const shape& src, shape& dest) { + dest = src; + } + Circle c2 {{1,1}, 43}; + assign( c, c2); // oops, not the whole state is transferred + assert( c == c2); // if we supply copying, we should also provide comparison, The result will be meaningless because the center and radius will not be copied from `c` into `s`. The first defense against this is to [define the base class `Shape` not to allow this](#Rc-copy-virtual).