[ 
https://issues.apache.org/jira/browse/MESOS-2756?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14561583#comment-14561583
 ] 

Joris Van Remoortere commented on MESOS-2756:
---------------------------------------------

I think the issue with the paragraph that you quote, is that most people will 
forget that there are default copy constructors provided. The absence of 
visible code is likely to lead to this kind of object slicing bug.

I would prefer to explicitly mandate that we mark all base classes with either:
* A macro like ABSTRACT_CLASS(T);
* Explicit protected constructors, even if they are then defaulted (i.e. T() = 
default).

There is a similar suggestion in MESOS-2762 to explicitly call out certain 
constructors (and then default them), so that there is clear visibility as to 
what should be allowed under which access modifiers.

> Update style guide: Avoid object slicing
> ----------------------------------------
>
>                 Key: MESOS-2756
>                 URL: https://issues.apache.org/jira/browse/MESOS-2756
>             Project: Mesos
>          Issue Type: Improvement
>            Reporter: Joris Van Remoortere
>            Assignee: Joris Van Remoortere
>              Labels: c++
>
> In order to improve the safety of our code base, let's augment the style 
> guide to:
> "Disallow public construction of base classes"
> so that we can avoid the object slicing problem. This is a good pattern to 
> follow in general as it prevents subtle semantic bugs like the following:
> {code:title=ObjectSlicing.cpp|borderStyle=solid}
> #include <stdio.h>
> #include <vector>
> class Base {
>   public:
>   Base(int _v) : v(_v) {}
>   virtual int get() const { return v; }
>   protected:
>   int v;
> };
> class Derived : public Base {
>   public:
>   Derived(int _v) : Base(_v) {}
>   virtual int get() const { return v + 1; }
> };
> int main() {
>   Base b(5);
>   Derived d(5);
>   std::vector<Base> vec;
>   vec.push_back(b);
>   vec.push_back(d);
>   for (const auto& v : vec) {
>     printf("[%d]\n", v.get());
>   }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to