Idiomatic way to prevent slicing? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) The Ask Question Wizard is Live! Data science time! April 2019 and salary with experienceForce function to be called only with specific typesWhat is object slicing?How to initialize a const field in constructor?What's the point of g++ -Wreorder?Java: Can Vector<derived> be called as Vector<base>?Easiest way to convert int to string in C++capture variables inside of subclass?Detecting if a type can be derived from in C++Implementing polymorphic operator==() in C++ idiomatic wayIs using inline classes inside a function permitted to be used as template types?Short-circuit evaluation and assignment in C++

Windows 10: How to Lock (not sleep) laptop on lid close?

Limit for e and 1/e

Is it possible to ask for a hotel room without minibar/extra services?

Is there a documented rationale why the House Ways and Means chairman can demand tax info?

What items from the Roman-age tech-level could be used to deter all creatures from entering a small area?

Does a C shift expression have unsigned type? Why would Splint warn about a right-shift?

How does modal jazz use chord progressions?

Can a zero nonce be safely used with AES-GCM if the key is random and never used again?

Replacing HDD with SSD; what about non-APFS/APFS?

Single author papers against my advisor's will?

How do you clear the ApexPages.getMessages() collection in a test?

Fishing simulator

Stop battery usage [Ubuntu 18]

What was the last x86 CPU that did not have the x87 floating-point unit built in?

If A makes B more likely then B makes A more likely"

Can I throw a longsword at someone?

Can the prologue be the backstory of your main character?

Two different pronunciation of "понял"

What do you call the holes in a flute?

Was credit for the black hole image misattributed?

Are my PIs rude or am I just being too sensitive?

I'm thinking of a number

Strange behaviour of Check

Determine whether f is a function, an injection, a surjection



Idiomatic way to prevent slicing?



Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
The Ask Question Wizard is Live!
Data science time! April 2019 and salary with experienceForce function to be called only with specific typesWhat is object slicing?How to initialize a const field in constructor?What's the point of g++ -Wreorder?Java: Can Vector<derived> be called as Vector<base>?Easiest way to convert int to string in C++capture variables inside of subclass?Detecting if a type can be derived from in C++Implementing polymorphic operator==() in C++ idiomatic wayIs using inline classes inside a function permitted to be used as template types?Short-circuit evaluation and assignment in C++



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








15















Sometimes it can be an annoyance that c++ defaults to allow slicing. For example



struct foo int a; ;
struct bar : foo int b; ;

int main()
bar x1,2;
foo y = x; // <- I dont want this to compile!



This compiles and runs as expected! Though, what if I dont want to enable slicing?



What is the idiomatic way to write foo such that one cannot slice instances of any derived class?










share|improve this question
























  • The easiest way is to not use inheritance. You have have foo be a member variable of bar.

    – KevinZ
    2 days ago











  • @KevinZ stackoverflow.com/a/55600208/4117728

    – user463035818
    2 days ago

















15















Sometimes it can be an annoyance that c++ defaults to allow slicing. For example



struct foo int a; ;
struct bar : foo int b; ;

int main()
bar x1,2;
foo y = x; // <- I dont want this to compile!



This compiles and runs as expected! Though, what if I dont want to enable slicing?



What is the idiomatic way to write foo such that one cannot slice instances of any derived class?










share|improve this question
























  • The easiest way is to not use inheritance. You have have foo be a member variable of bar.

    – KevinZ
    2 days ago











  • @KevinZ stackoverflow.com/a/55600208/4117728

    – user463035818
    2 days ago













15












15








15


4






Sometimes it can be an annoyance that c++ defaults to allow slicing. For example



struct foo int a; ;
struct bar : foo int b; ;

int main()
bar x1,2;
foo y = x; // <- I dont want this to compile!



This compiles and runs as expected! Though, what if I dont want to enable slicing?



What is the idiomatic way to write foo such that one cannot slice instances of any derived class?










share|improve this question
















Sometimes it can be an annoyance that c++ defaults to allow slicing. For example



struct foo int a; ;
struct bar : foo int b; ;

int main()
bar x1,2;
foo y = x; // <- I dont want this to compile!



This compiles and runs as expected! Though, what if I dont want to enable slicing?



What is the idiomatic way to write foo such that one cannot slice instances of any derived class?







c++ inheritance object-slicing






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 days ago







user463035818

















asked Apr 9 at 19:32









user463035818user463035818

19.1k42971




19.1k42971












  • The easiest way is to not use inheritance. You have have foo be a member variable of bar.

    – KevinZ
    2 days ago











  • @KevinZ stackoverflow.com/a/55600208/4117728

    – user463035818
    2 days ago

















  • The easiest way is to not use inheritance. You have have foo be a member variable of bar.

    – KevinZ
    2 days ago











  • @KevinZ stackoverflow.com/a/55600208/4117728

    – user463035818
    2 days ago
















The easiest way is to not use inheritance. You have have foo be a member variable of bar.

– KevinZ
2 days ago





The easiest way is to not use inheritance. You have have foo be a member variable of bar.

– KevinZ
2 days ago













@KevinZ stackoverflow.com/a/55600208/4117728

– user463035818
2 days ago





@KevinZ stackoverflow.com/a/55600208/4117728

– user463035818
2 days ago












3 Answers
3






active

oldest

votes


















16














I'm not sure if there is a named idiom for it but you can add a deleted function to the overload set that is a better match then the base classes slicing operations. If you change foo to



struct foo 

int a;
foo() = default; // you have to add this because of the template constructor

template<typename T>
foo(const T&) = delete; // error trying to copy anything but a foo

template<typename T>
foo& operator=(const T&) = delete; // error assigning anything else but a foo
;


then you can only ever copy construct or copy assign a foo to foo. Any other type will pick the function template and you'll get an error about using a deleted function. This does mean that your class, and the classes that use it can no longer be an aggregate though. Since the members that are added are templates, they are not considered copy constructors or copy assignment operators so you'll get the default copy and move constructors and assignment operators.






share|improve this answer

























  • Note that this doesn't prevent explicit slicing like this: foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.

    – eerorika
    Apr 9 at 20:02











  • if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general

    – user463035818
    Apr 9 at 20:05






  • 1





    @user463035818 Yep. I've been using it since I've asked that Q.

    – NathanOliver
    Apr 9 at 20:06






  • 4





    I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.

    – NathanOliver
    Apr 9 at 20:08












  • actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)

    – user463035818
    Apr 10 at 8:23


















5














Since 2011, the idiomatic way has been to use auto:



#include <iostream>
struct foo int a; ;
struct bar : foo int b; ;

int main()
bar x1,2;
auto y = x; // <- y is a bar



If you wish to actively prevent slicing, there are a number of ways:



Usually the most preferable way, unless you specifically need inheritance (you often don't) is to use encapsulation:



#include <iostream>

struct foo int a; ;
struct bar

bar(int a, int b)
: foo_(a)
, b(b)


int b;

int get_a() const return foo_.a;

private:
foo foo_;
;

int main()
bar x1,2;
// foo y = x; // <- does not compile




Another more specialised way might be to alter the permissions around copy operators:



#include <iostream>

struct foo
int a;
protected:
foo(foo const&) = default;
foo(foo&&) = default;
foo& operator=(foo const&) = default;
foo& operator=(foo&&) = default;

;

struct bar : foo

bar(int a, int b)
: fooa, bb


int b;
;

int main()
auto x = bar (1,2);
// foo y = x; // <- does not compile






share|improve this answer






























    3














    You can prevent the base from being copied outside of member functions of derived classes and the base itself by declaring the copy constructor protected:



    struct foo 
    // ...
    protected:
    foo(foo&) = default;
    ;





    share|improve this answer


















    • 6





      but then I cannot copy foos anymore :( I'd like to prevent only copying a bar to a foo if possible

      – user463035818
      Apr 9 at 19:42











    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55600025%2fidiomatic-way-to-prevent-slicing%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    16














    I'm not sure if there is a named idiom for it but you can add a deleted function to the overload set that is a better match then the base classes slicing operations. If you change foo to



    struct foo 

    int a;
    foo() = default; // you have to add this because of the template constructor

    template<typename T>
    foo(const T&) = delete; // error trying to copy anything but a foo

    template<typename T>
    foo& operator=(const T&) = delete; // error assigning anything else but a foo
    ;


    then you can only ever copy construct or copy assign a foo to foo. Any other type will pick the function template and you'll get an error about using a deleted function. This does mean that your class, and the classes that use it can no longer be an aggregate though. Since the members that are added are templates, they are not considered copy constructors or copy assignment operators so you'll get the default copy and move constructors and assignment operators.






    share|improve this answer

























    • Note that this doesn't prevent explicit slicing like this: foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.

      – eerorika
      Apr 9 at 20:02











    • if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general

      – user463035818
      Apr 9 at 20:05






    • 1





      @user463035818 Yep. I've been using it since I've asked that Q.

      – NathanOliver
      Apr 9 at 20:06






    • 4





      I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.

      – NathanOliver
      Apr 9 at 20:08












    • actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)

      – user463035818
      Apr 10 at 8:23















    16














    I'm not sure if there is a named idiom for it but you can add a deleted function to the overload set that is a better match then the base classes slicing operations. If you change foo to



    struct foo 

    int a;
    foo() = default; // you have to add this because of the template constructor

    template<typename T>
    foo(const T&) = delete; // error trying to copy anything but a foo

    template<typename T>
    foo& operator=(const T&) = delete; // error assigning anything else but a foo
    ;


    then you can only ever copy construct or copy assign a foo to foo. Any other type will pick the function template and you'll get an error about using a deleted function. This does mean that your class, and the classes that use it can no longer be an aggregate though. Since the members that are added are templates, they are not considered copy constructors or copy assignment operators so you'll get the default copy and move constructors and assignment operators.






    share|improve this answer

























    • Note that this doesn't prevent explicit slicing like this: foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.

      – eerorika
      Apr 9 at 20:02











    • if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general

      – user463035818
      Apr 9 at 20:05






    • 1





      @user463035818 Yep. I've been using it since I've asked that Q.

      – NathanOliver
      Apr 9 at 20:06






    • 4





      I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.

      – NathanOliver
      Apr 9 at 20:08












    • actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)

      – user463035818
      Apr 10 at 8:23













    16












    16








    16







    I'm not sure if there is a named idiom for it but you can add a deleted function to the overload set that is a better match then the base classes slicing operations. If you change foo to



    struct foo 

    int a;
    foo() = default; // you have to add this because of the template constructor

    template<typename T>
    foo(const T&) = delete; // error trying to copy anything but a foo

    template<typename T>
    foo& operator=(const T&) = delete; // error assigning anything else but a foo
    ;


    then you can only ever copy construct or copy assign a foo to foo. Any other type will pick the function template and you'll get an error about using a deleted function. This does mean that your class, and the classes that use it can no longer be an aggregate though. Since the members that are added are templates, they are not considered copy constructors or copy assignment operators so you'll get the default copy and move constructors and assignment operators.






    share|improve this answer















    I'm not sure if there is a named idiom for it but you can add a deleted function to the overload set that is a better match then the base classes slicing operations. If you change foo to



    struct foo 

    int a;
    foo() = default; // you have to add this because of the template constructor

    template<typename T>
    foo(const T&) = delete; // error trying to copy anything but a foo

    template<typename T>
    foo& operator=(const T&) = delete; // error assigning anything else but a foo
    ;


    then you can only ever copy construct or copy assign a foo to foo. Any other type will pick the function template and you'll get an error about using a deleted function. This does mean that your class, and the classes that use it can no longer be an aggregate though. Since the members that are added are templates, they are not considered copy constructors or copy assignment operators so you'll get the default copy and move constructors and assignment operators.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Apr 9 at 19:56

























    answered Apr 9 at 19:43









    NathanOliverNathanOliver

    98.8k16138218




    98.8k16138218












    • Note that this doesn't prevent explicit slicing like this: foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.

      – eerorika
      Apr 9 at 20:02











    • if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general

      – user463035818
      Apr 9 at 20:05






    • 1





      @user463035818 Yep. I've been using it since I've asked that Q.

      – NathanOliver
      Apr 9 at 20:06






    • 4





      I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.

      – NathanOliver
      Apr 9 at 20:08












    • actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)

      – user463035818
      Apr 10 at 8:23

















    • Note that this doesn't prevent explicit slicing like this: foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.

      – eerorika
      Apr 9 at 20:02











    • if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general

      – user463035818
      Apr 9 at 20:05






    • 1





      @user463035818 Yep. I've been using it since I've asked that Q.

      – NathanOliver
      Apr 9 at 20:06






    • 4





      I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.

      – NathanOliver
      Apr 9 at 20:08












    • actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)

      – user463035818
      Apr 10 at 8:23
















    Note that this doesn't prevent explicit slicing like this: foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.

    – eerorika
    Apr 9 at 20:02





    Note that this doesn't prevent explicit slicing like this: foo y = static_cast<foo&>(x);. That said, perhaps it's not a problem to OP.

    – eerorika
    Apr 9 at 20:02













    if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general

    – user463035818
    Apr 9 at 20:05





    if I understand correctly this is a nice way to prevent implicit conversions for function parameters in general

    – user463035818
    Apr 9 at 20:05




    1




    1





    @user463035818 Yep. I've been using it since I've asked that Q.

    – NathanOliver
    Apr 9 at 20:06





    @user463035818 Yep. I've been using it since I've asked that Q.

    – NathanOliver
    Apr 9 at 20:06




    4




    4





    I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.

    – NathanOliver
    Apr 9 at 20:08






    I look at it as reverse SFINAE. You make the overloads you want to compile, and then add a deleted template stopping everything else.

    – NathanOliver
    Apr 9 at 20:08














    actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)

    – user463035818
    Apr 10 at 8:23





    actually I was a bit hestitant to accept this answer. The technique is great, but in fact it opens the door to specializing all kinds of unwanted assignments, though if I have to choose between the javaish "protect against every possible stupidity at any cost" vs a pythonic "we are all adults" then I know what to pick ;)

    – user463035818
    Apr 10 at 8:23













    5














    Since 2011, the idiomatic way has been to use auto:



    #include <iostream>
    struct foo int a; ;
    struct bar : foo int b; ;

    int main()
    bar x1,2;
    auto y = x; // <- y is a bar



    If you wish to actively prevent slicing, there are a number of ways:



    Usually the most preferable way, unless you specifically need inheritance (you often don't) is to use encapsulation:



    #include <iostream>

    struct foo int a; ;
    struct bar

    bar(int a, int b)
    : foo_(a)
    , b(b)


    int b;

    int get_a() const return foo_.a;

    private:
    foo foo_;
    ;

    int main()
    bar x1,2;
    // foo y = x; // <- does not compile




    Another more specialised way might be to alter the permissions around copy operators:



    #include <iostream>

    struct foo
    int a;
    protected:
    foo(foo const&) = default;
    foo(foo&&) = default;
    foo& operator=(foo const&) = default;
    foo& operator=(foo&&) = default;

    ;

    struct bar : foo

    bar(int a, int b)
    : fooa, bb


    int b;
    ;

    int main()
    auto x = bar (1,2);
    // foo y = x; // <- does not compile






    share|improve this answer



























      5














      Since 2011, the idiomatic way has been to use auto:



      #include <iostream>
      struct foo int a; ;
      struct bar : foo int b; ;

      int main()
      bar x1,2;
      auto y = x; // <- y is a bar



      If you wish to actively prevent slicing, there are a number of ways:



      Usually the most preferable way, unless you specifically need inheritance (you often don't) is to use encapsulation:



      #include <iostream>

      struct foo int a; ;
      struct bar

      bar(int a, int b)
      : foo_(a)
      , b(b)


      int b;

      int get_a() const return foo_.a;

      private:
      foo foo_;
      ;

      int main()
      bar x1,2;
      // foo y = x; // <- does not compile




      Another more specialised way might be to alter the permissions around copy operators:



      #include <iostream>

      struct foo
      int a;
      protected:
      foo(foo const&) = default;
      foo(foo&&) = default;
      foo& operator=(foo const&) = default;
      foo& operator=(foo&&) = default;

      ;

      struct bar : foo

      bar(int a, int b)
      : fooa, bb


      int b;
      ;

      int main()
      auto x = bar (1,2);
      // foo y = x; // <- does not compile






      share|improve this answer

























        5












        5








        5







        Since 2011, the idiomatic way has been to use auto:



        #include <iostream>
        struct foo int a; ;
        struct bar : foo int b; ;

        int main()
        bar x1,2;
        auto y = x; // <- y is a bar



        If you wish to actively prevent slicing, there are a number of ways:



        Usually the most preferable way, unless you specifically need inheritance (you often don't) is to use encapsulation:



        #include <iostream>

        struct foo int a; ;
        struct bar

        bar(int a, int b)
        : foo_(a)
        , b(b)


        int b;

        int get_a() const return foo_.a;

        private:
        foo foo_;
        ;

        int main()
        bar x1,2;
        // foo y = x; // <- does not compile




        Another more specialised way might be to alter the permissions around copy operators:



        #include <iostream>

        struct foo
        int a;
        protected:
        foo(foo const&) = default;
        foo(foo&&) = default;
        foo& operator=(foo const&) = default;
        foo& operator=(foo&&) = default;

        ;

        struct bar : foo

        bar(int a, int b)
        : fooa, bb


        int b;
        ;

        int main()
        auto x = bar (1,2);
        // foo y = x; // <- does not compile






        share|improve this answer













        Since 2011, the idiomatic way has been to use auto:



        #include <iostream>
        struct foo int a; ;
        struct bar : foo int b; ;

        int main()
        bar x1,2;
        auto y = x; // <- y is a bar



        If you wish to actively prevent slicing, there are a number of ways:



        Usually the most preferable way, unless you specifically need inheritance (you often don't) is to use encapsulation:



        #include <iostream>

        struct foo int a; ;
        struct bar

        bar(int a, int b)
        : foo_(a)
        , b(b)


        int b;

        int get_a() const return foo_.a;

        private:
        foo foo_;
        ;

        int main()
        bar x1,2;
        // foo y = x; // <- does not compile




        Another more specialised way might be to alter the permissions around copy operators:



        #include <iostream>

        struct foo
        int a;
        protected:
        foo(foo const&) = default;
        foo(foo&&) = default;
        foo& operator=(foo const&) = default;
        foo& operator=(foo&&) = default;

        ;

        struct bar : foo

        bar(int a, int b)
        : fooa, bb


        int b;
        ;

        int main()
        auto x = bar (1,2);
        // foo y = x; // <- does not compile







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Apr 9 at 19:43









        Richard HodgesRichard Hodges

        57.1k658105




        57.1k658105





















            3














            You can prevent the base from being copied outside of member functions of derived classes and the base itself by declaring the copy constructor protected:



            struct foo 
            // ...
            protected:
            foo(foo&) = default;
            ;





            share|improve this answer


















            • 6





              but then I cannot copy foos anymore :( I'd like to prevent only copying a bar to a foo if possible

              – user463035818
              Apr 9 at 19:42















            3














            You can prevent the base from being copied outside of member functions of derived classes and the base itself by declaring the copy constructor protected:



            struct foo 
            // ...
            protected:
            foo(foo&) = default;
            ;





            share|improve this answer


















            • 6





              but then I cannot copy foos anymore :( I'd like to prevent only copying a bar to a foo if possible

              – user463035818
              Apr 9 at 19:42













            3












            3








            3







            You can prevent the base from being copied outside of member functions of derived classes and the base itself by declaring the copy constructor protected:



            struct foo 
            // ...
            protected:
            foo(foo&) = default;
            ;





            share|improve this answer













            You can prevent the base from being copied outside of member functions of derived classes and the base itself by declaring the copy constructor protected:



            struct foo 
            // ...
            protected:
            foo(foo&) = default;
            ;






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Apr 9 at 19:41









            eerorikaeerorika

            90.1k665137




            90.1k665137







            • 6





              but then I cannot copy foos anymore :( I'd like to prevent only copying a bar to a foo if possible

              – user463035818
              Apr 9 at 19:42












            • 6





              but then I cannot copy foos anymore :( I'd like to prevent only copying a bar to a foo if possible

              – user463035818
              Apr 9 at 19:42







            6




            6





            but then I cannot copy foos anymore :( I'd like to prevent only copying a bar to a foo if possible

            – user463035818
            Apr 9 at 19:42





            but then I cannot copy foos anymore :( I'd like to prevent only copying a bar to a foo if possible

            – user463035818
            Apr 9 at 19:42

















            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55600025%2fidiomatic-way-to-prevent-slicing%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Club Baloncesto Breogán Índice Historia | Pavillón | Nome | O Breogán na cultura popular | Xogadores | Adestradores | Presidentes | Palmarés | Historial | Líderes | Notas | Véxase tamén | Menú de navegacióncbbreogan.galCadroGuía oficial da ACB 2009-10, páxina 201Guía oficial ACB 1992, páxina 183. Editorial DB.É de 6.500 espectadores sentados axeitándose á última normativa"Estudiantes Junior, entre as mellores canteiras"o orixinalHemeroteca El Mundo Deportivo, 16 setembro de 1970, páxina 12Historia do BreogánAlfredo Pérez, o último canoneiroHistoria C.B. BreogánHemeroteca de El Mundo DeportivoJimmy Wright, norteamericano do Breogán deixará Lugo por ameazas de morteResultados de Breogán en 1986-87Resultados de Breogán en 1990-91Ficha de Velimir Perasović en acb.comResultados de Breogán en 1994-95Breogán arrasa al Barça. "El Mundo Deportivo", 27 de setembro de 1999, páxina 58CB Breogán - FC BarcelonaA FEB invita a participar nunha nova Liga EuropeaCharlie Bell na prensa estatalMáximos anotadores 2005Tempada 2005-06 : Tódolos Xogadores da Xornada""Non quero pensar nunha man negra, mais pregúntome que está a pasar""o orixinalRaúl López, orgulloso dos xogadores, presume da boa saúde económica do BreogánJulio González confirma que cesa como presidente del BreogánHomenaxe a Lisardo GómezA tempada do rexurdimento celesteEntrevista a Lisardo GómezEl COB dinamita el Pazo para forzar el quinto (69-73)Cafés Candelas, patrocinador del CB Breogán"Suso Lázare, novo presidente do Breogán"o orixinalCafés Candelas Breogán firma el mayor triunfo de la historiaEl Breogán realizará 17 homenajes por su cincuenta aniversario"O Breogán honra ao seu fundador e primeiro presidente"o orixinalMiguel Giao recibiu a homenaxe do PazoHomenaxe aos primeiros gladiadores celestesO home que nos amosa como ver o Breo co corazónTita Franco será homenaxeada polos #50anosdeBreoJulio Vila recibirá unha homenaxe in memoriam polos #50anosdeBreo"O Breogán homenaxeará aos seus aboados máis veteráns"Pechada ovación a «Capi» Sanmartín e Ricardo «Corazón de González»Homenaxe por décadas de informaciónPaco García volve ao Pazo con motivo do 50 aniversario"Resultados y clasificaciones""O Cafés Candelas Breogán, campión da Copa Princesa""O Cafés Candelas Breogán, equipo ACB"C.B. Breogán"Proxecto social"o orixinal"Centros asociados"o orixinalFicha en imdb.comMario Camus trata la recuperación del amor en 'La vieja música', su última película"Páxina web oficial""Club Baloncesto Breogán""C. B. Breogán S.A.D."eehttp://www.fegaba.com

            Vilaño, A Laracha Índice Patrimonio | Lugares e parroquias | Véxase tamén | Menú de navegación43°14′52″N 8°36′03″O / 43.24775, -8.60070

            Cegueira Índice Epidemioloxía | Deficiencia visual | Tipos de cegueira | Principais causas de cegueira | Tratamento | Técnicas de adaptación e axudas | Vida dos cegos | Primeiros auxilios | Crenzas respecto das persoas cegas | Crenzas das persoas cegas | O neno deficiente visual | Aspectos psicolóxicos da cegueira | Notas | Véxase tamén | Menú de navegación54.054.154.436928256blindnessDicionario da Real Academia GalegaPortal das Palabras"International Standards: Visual Standards — Aspects and Ranges of Vision Loss with Emphasis on Population Surveys.""Visual impairment and blindness""Presentan un plan para previr a cegueira"o orixinalACCDV Associació Catalana de Cecs i Disminuïts Visuals - PMFTrachoma"Effect of gene therapy on visual function in Leber's congenital amaurosis"1844137110.1056/NEJMoa0802268Cans guía - os mellores amigos dos cegosArquivadoEscola de cans guía para cegos en Mortágua, PortugalArquivado"Tecnología para ciegos y deficientes visuales. Recopilación de recursos gratuitos en la Red""Colorino""‘COL.diesis’, escuchar los sonidos del color""COL.diesis: Transforming Colour into Melody and Implementing the Result in a Colour Sensor Device"o orixinal"Sistema de desarrollo de sinestesia color-sonido para invidentes utilizando un protocolo de audio""Enseñanza táctil - geometría y color. Juegos didácticos para niños ciegos y videntes""Sistema Constanz"L'ocupació laboral dels cecs a l'Estat espanyol està pràcticament equiparada a la de les persones amb visió, entrevista amb Pedro ZuritaONCE (Organización Nacional de Cegos de España)Prevención da cegueiraDescrición de deficiencias visuais (Disc@pnet)Braillín, un boneco atractivo para calquera neno, con ou sen discapacidade, que permite familiarizarse co sistema de escritura e lectura brailleAxudas Técnicas36838ID00897494007150-90057129528256DOID:1432HP:0000618D001766C10.597.751.941.162C97109C0155020