Why are std::future and std::promise not final?Are C++11 standard containers “final”?When to use virtual destructors?Where and why do I have to put the “template” and “typename” keywords?Do I need to explicitly call the base virtual destructor?Why is “using namespace std;” considered bad practice?Why do we need virtual functions in C++?Why should C++ programmers minimize use of 'new'?Why are elementwise additions much faster in separate loops than in a combined loop?Why is processing a sorted array faster than processing an unsorted array?Futures vs. PromisesWhy should I use a pointer rather than the object itself?

What is /dev/null and why can't I use hx on it?

Iron-age tools, is there a way to extract heavy metals out of a creature?

Can a Dragon enter the feywild at will?

Why didn't Trudy wear a breathing mask in Avatar?

Can something have more sugar per 100g than the percentage of sugar that's in it?

Can I color text by using an image, so that the color isn't flat?

How to handle motorists' dangerous behaviour with an impassable group?

Son of the Revenge of the Riley Riddles in Reverse Strikes Again

How to discipline overeager engineer

A sentient carnivorous species trying to preserve life. How could they find a new food source?

This fell out of my toilet when I unscrewed the supply line. What is it?

Looking for PC graphics demo software from the early 90s called "Unreal"

3x3 self-descriptive squares

Without exposing his identity, did Roy help his parents with money so that they can afford to stay in their home?

Would we have more than 8 minutes of light, if the sun "went out"?

How to make a gift without seeming creepy?

Can a Creature at 0 HP Take Damage?

Is having your hand in your pocket during a presentation bad?

How are steel imports supposed to threaten US national security?

"Es gefällt ihm." How to identify similar exceptions?

Why does allocating a single 2D array take longer than a loop allocating multiple 1D arrays of the same total size and shape?

How to measure torque accurately?

Canceling a color specification

Is insurance company’s preferred auto shop biased?



Why are std::future and std::promise not final?


Are C++11 standard containers “final”?When to use virtual destructors?Where and why do I have to put the “template” and “typename” keywords?Do I need to explicitly call the base virtual destructor?Why is “using namespace std;” considered bad practice?Why do we need virtual functions in C++?Why should C++ programmers minimize use of 'new'?Why are elementwise additions much faster in separate loops than in a combined loop?Why is processing a sorted array faster than processing an unsorted array?Futures vs. PromisesWhy should I use a pointer rather than the object itself?






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty
margin-bottom:0;









14















I wounder why the classes std::future and std::promise are not marked with the final specifier. The destructor is not virtual so why was final not added? What was (is) the rationale?










share|improve this question





















  • 9





    no class in the standard library is marked final.

    – bolov
    Apr 17 at 10:49







  • 3





    stackoverflow.com/questions/9298450/…

    – bolov
    Apr 17 at 10:52






  • 7





    Inheriting from a class with a non-virtual destructor is not inherently bad. You just have to be careful how you use it. If you never delete a derived object through a base class pointer, then you don't need a virtual destructor.

    – Jesper Juhl
    Apr 17 at 11:33






  • 2





    "I can't think of a reason to do it" is not the same as "nobody could possibly want to do it". I've been surprised many times by things I thought were obvious nonsense that turned out to be useful when viewed from a different perspective.

    – Pete Becker
    Apr 17 at 12:15






  • 2





    @Mirko: b). Adding member is fine, as state above, it is calling destructor of derived object from base class which is UB (even if same size). c). Whereas I see cases for strong typedef for int/float, I don't see for std::vector<int> :)

    – Jarod42
    Apr 17 at 13:43

















14















I wounder why the classes std::future and std::promise are not marked with the final specifier. The destructor is not virtual so why was final not added? What was (is) the rationale?










share|improve this question





















  • 9





    no class in the standard library is marked final.

    – bolov
    Apr 17 at 10:49







  • 3





    stackoverflow.com/questions/9298450/…

    – bolov
    Apr 17 at 10:52






  • 7





    Inheriting from a class with a non-virtual destructor is not inherently bad. You just have to be careful how you use it. If you never delete a derived object through a base class pointer, then you don't need a virtual destructor.

    – Jesper Juhl
    Apr 17 at 11:33






  • 2





    "I can't think of a reason to do it" is not the same as "nobody could possibly want to do it". I've been surprised many times by things I thought were obvious nonsense that turned out to be useful when viewed from a different perspective.

    – Pete Becker
    Apr 17 at 12:15






  • 2





    @Mirko: b). Adding member is fine, as state above, it is calling destructor of derived object from base class which is UB (even if same size). c). Whereas I see cases for strong typedef for int/float, I don't see for std::vector<int> :)

    – Jarod42
    Apr 17 at 13:43













14












14








14








I wounder why the classes std::future and std::promise are not marked with the final specifier. The destructor is not virtual so why was final not added? What was (is) the rationale?










share|improve this question
















I wounder why the classes std::future and std::promise are not marked with the final specifier. The destructor is not virtual so why was final not added? What was (is) the rationale?







c++ c++11 c++14 language-lawyer






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Apr 17 at 11:16









P.W

22.2k4 gold badges24 silver badges62 bronze badges




22.2k4 gold badges24 silver badges62 bronze badges










asked Apr 17 at 10:39









Sonic78Sonic78

3992 silver badges14 bronze badges




3992 silver badges14 bronze badges










  • 9





    no class in the standard library is marked final.

    – bolov
    Apr 17 at 10:49







  • 3





    stackoverflow.com/questions/9298450/…

    – bolov
    Apr 17 at 10:52






  • 7





    Inheriting from a class with a non-virtual destructor is not inherently bad. You just have to be careful how you use it. If you never delete a derived object through a base class pointer, then you don't need a virtual destructor.

    – Jesper Juhl
    Apr 17 at 11:33






  • 2





    "I can't think of a reason to do it" is not the same as "nobody could possibly want to do it". I've been surprised many times by things I thought were obvious nonsense that turned out to be useful when viewed from a different perspective.

    – Pete Becker
    Apr 17 at 12:15






  • 2





    @Mirko: b). Adding member is fine, as state above, it is calling destructor of derived object from base class which is UB (even if same size). c). Whereas I see cases for strong typedef for int/float, I don't see for std::vector<int> :)

    – Jarod42
    Apr 17 at 13:43












  • 9





    no class in the standard library is marked final.

    – bolov
    Apr 17 at 10:49







  • 3





    stackoverflow.com/questions/9298450/…

    – bolov
    Apr 17 at 10:52






  • 7





    Inheriting from a class with a non-virtual destructor is not inherently bad. You just have to be careful how you use it. If you never delete a derived object through a base class pointer, then you don't need a virtual destructor.

    – Jesper Juhl
    Apr 17 at 11:33






  • 2





    "I can't think of a reason to do it" is not the same as "nobody could possibly want to do it". I've been surprised many times by things I thought were obvious nonsense that turned out to be useful when viewed from a different perspective.

    – Pete Becker
    Apr 17 at 12:15






  • 2





    @Mirko: b). Adding member is fine, as state above, it is calling destructor of derived object from base class which is UB (even if same size). c). Whereas I see cases for strong typedef for int/float, I don't see for std::vector<int> :)

    – Jarod42
    Apr 17 at 13:43







9




9





no class in the standard library is marked final.

– bolov
Apr 17 at 10:49






no class in the standard library is marked final.

– bolov
Apr 17 at 10:49





3




3





stackoverflow.com/questions/9298450/…

– bolov
Apr 17 at 10:52





stackoverflow.com/questions/9298450/…

– bolov
Apr 17 at 10:52




7




7





Inheriting from a class with a non-virtual destructor is not inherently bad. You just have to be careful how you use it. If you never delete a derived object through a base class pointer, then you don't need a virtual destructor.

– Jesper Juhl
Apr 17 at 11:33





Inheriting from a class with a non-virtual destructor is not inherently bad. You just have to be careful how you use it. If you never delete a derived object through a base class pointer, then you don't need a virtual destructor.

– Jesper Juhl
Apr 17 at 11:33




2




2





"I can't think of a reason to do it" is not the same as "nobody could possibly want to do it". I've been surprised many times by things I thought were obvious nonsense that turned out to be useful when viewed from a different perspective.

– Pete Becker
Apr 17 at 12:15





"I can't think of a reason to do it" is not the same as "nobody could possibly want to do it". I've been surprised many times by things I thought were obvious nonsense that turned out to be useful when viewed from a different perspective.

– Pete Becker
Apr 17 at 12:15




2




2





@Mirko: b). Adding member is fine, as state above, it is calling destructor of derived object from base class which is UB (even if same size). c). Whereas I see cases for strong typedef for int/float, I don't see for std::vector<int> :)

– Jarod42
Apr 17 at 13:43





@Mirko: b). Adding member is fine, as state above, it is calling destructor of derived object from base class which is UB (even if same size). c). Whereas I see cases for strong typedef for int/float, I don't see for std::vector<int> :)

– Jarod42
Apr 17 at 13:43












3 Answers
3






active

oldest

votes


















16
















As per [derivation]/4:




All types specified in the C++ standard library shall be non-final types unless otherwise specified.




And std::future or std::promise are not excepted.



And as mentioned in a comment, this issue has been discussed before. Do library implementers have the freedom to add final to non-polymorphic components?.



The resolution of this issue was that it was not considered a defect with the conclusion:




Unless the library uses the keyword final in a specification, the user clearly has freedom to derive from such a class, and so equally clearly, the library vendor does not have freedom to add a final overrider or class attribute.







share|improve this answer
































    19
















    Have a look at this contrived (admittedly nonsensical) example with std::vector:



    template <class T>
    struct Example : private std::vector<T>
    void doStuff(const T& t) this->push_back(t);
    T retrieveStuff() return this->operator[](0);
    ;

    Example<int> e;

    e.doStuff(42);
    std::cout << e.retrieveStuff() << "n";


    This works, you can't get into UB due to std::vector::~vector not being virtual because you can't delete an object through a base class pointer (public inheritance is needed there).



    The inheritance here is just an implementation detail. Not recommended practice, but people probably did and do this. Once the decision is made to not break existing code by making std::vector or other container types final, it makes sense to stick to that with different vocabulary types like std::promise or std::future.






    share|improve this answer




















    • 1





      It is cleaner to do inheritance if you're exposing base functions via using. That could help you to avoid reimplementing an operator[] that only refers to member[] for every possible case.

      – Mirko
      Apr 17 at 12:21











    • Also, you could extend functionality as in your example using public inheritance, given that you don't add any members that change the size of the class.

      – Mirko
      Apr 17 at 12:27






    • 3





      @Mirko The example is intended to only show some non-ill-formed, non-UB use case related to the OP's question. And public inheritance opens the door for UB, as it allows invoking the non-virtual destructor..

      – lubgr
      Apr 17 at 12:28






    • 7





      @Mirko "there's no problem invoking base class non virtual destructor" really? Or is it that it appears fine all the times you tried?

      – Caleth
      Apr 17 at 14:41






    • 2





      @Mirko You can add semantics to a derived class that require calling the proper destructor, without increasing the size of the class, so your static_assert is not necessarily sufficient. And in any case, the point of the answer was not to show the best way to inherit from something, just a legal way to derive from std::vector.

      – Max Langhof
      Apr 17 at 17:03



















    0
















    Absence of any virtual function in a class doesn't make it non-qualifiable as the Base class. In my opinion, adding virtual function(s) to the base class is kind of special case of making the base class as polymorphic. Many programmers careless put virtual to functions, and especially to the destructor of the class (and comment that "Virtual destructor is necessary").



    ATL, for example, relies heavily on inheritance but doesn't have any virtual functions. The (base) classes are non-polymorphic. Most (if not all) of the C++/STL classes are non-polymorphic.



    One may break the rule of "Prefer containment/composition over inheritance" and derive from a class in an illogical form (One example given by lubgr); but this is doable and is valid. Sometimes it is more appropriate to inherit from a non-polymorphic class, rather than containing a class.



    Template/Template-meta classes rely on inheritance where no virtual functions are involved. Attribute-inheritance is one example, where a class would inherit from various different classes (multi-inheritance), and inherit the attributes.



    One very simple example would be to make a class non_copyable, put copy-constructor/assignment-operator, etc as private/protected; and let other classes inherit from it. This way the "derived" class would inherit the non-copyable "capability/attribute" of the base class.






    share|improve this answer


























      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/4.0/"u003ecc by-sa 4.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%2f55725646%2fwhy-are-stdfuture-and-stdpromise-not-final%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
















      As per [derivation]/4:




      All types specified in the C++ standard library shall be non-final types unless otherwise specified.




      And std::future or std::promise are not excepted.



      And as mentioned in a comment, this issue has been discussed before. Do library implementers have the freedom to add final to non-polymorphic components?.



      The resolution of this issue was that it was not considered a defect with the conclusion:




      Unless the library uses the keyword final in a specification, the user clearly has freedom to derive from such a class, and so equally clearly, the library vendor does not have freedom to add a final overrider or class attribute.







      share|improve this answer





























        16
















        As per [derivation]/4:




        All types specified in the C++ standard library shall be non-final types unless otherwise specified.




        And std::future or std::promise are not excepted.



        And as mentioned in a comment, this issue has been discussed before. Do library implementers have the freedom to add final to non-polymorphic components?.



        The resolution of this issue was that it was not considered a defect with the conclusion:




        Unless the library uses the keyword final in a specification, the user clearly has freedom to derive from such a class, and so equally clearly, the library vendor does not have freedom to add a final overrider or class attribute.







        share|improve this answer



























          16














          16










          16









          As per [derivation]/4:




          All types specified in the C++ standard library shall be non-final types unless otherwise specified.




          And std::future or std::promise are not excepted.



          And as mentioned in a comment, this issue has been discussed before. Do library implementers have the freedom to add final to non-polymorphic components?.



          The resolution of this issue was that it was not considered a defect with the conclusion:




          Unless the library uses the keyword final in a specification, the user clearly has freedom to derive from such a class, and so equally clearly, the library vendor does not have freedom to add a final overrider or class attribute.







          share|improve this answer













          As per [derivation]/4:




          All types specified in the C++ standard library shall be non-final types unless otherwise specified.




          And std::future or std::promise are not excepted.



          And as mentioned in a comment, this issue has been discussed before. Do library implementers have the freedom to add final to non-polymorphic components?.



          The resolution of this issue was that it was not considered a defect with the conclusion:




          Unless the library uses the keyword final in a specification, the user clearly has freedom to derive from such a class, and so equally clearly, the library vendor does not have freedom to add a final overrider or class attribute.








          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Apr 17 at 11:09









          P.WP.W

          22.2k4 gold badges24 silver badges62 bronze badges




          22.2k4 gold badges24 silver badges62 bronze badges


























              19
















              Have a look at this contrived (admittedly nonsensical) example with std::vector:



              template <class T>
              struct Example : private std::vector<T>
              void doStuff(const T& t) this->push_back(t);
              T retrieveStuff() return this->operator[](0);
              ;

              Example<int> e;

              e.doStuff(42);
              std::cout << e.retrieveStuff() << "n";


              This works, you can't get into UB due to std::vector::~vector not being virtual because you can't delete an object through a base class pointer (public inheritance is needed there).



              The inheritance here is just an implementation detail. Not recommended practice, but people probably did and do this. Once the decision is made to not break existing code by making std::vector or other container types final, it makes sense to stick to that with different vocabulary types like std::promise or std::future.






              share|improve this answer




















              • 1





                It is cleaner to do inheritance if you're exposing base functions via using. That could help you to avoid reimplementing an operator[] that only refers to member[] for every possible case.

                – Mirko
                Apr 17 at 12:21











              • Also, you could extend functionality as in your example using public inheritance, given that you don't add any members that change the size of the class.

                – Mirko
                Apr 17 at 12:27






              • 3





                @Mirko The example is intended to only show some non-ill-formed, non-UB use case related to the OP's question. And public inheritance opens the door for UB, as it allows invoking the non-virtual destructor..

                – lubgr
                Apr 17 at 12:28






              • 7





                @Mirko "there's no problem invoking base class non virtual destructor" really? Or is it that it appears fine all the times you tried?

                – Caleth
                Apr 17 at 14:41






              • 2





                @Mirko You can add semantics to a derived class that require calling the proper destructor, without increasing the size of the class, so your static_assert is not necessarily sufficient. And in any case, the point of the answer was not to show the best way to inherit from something, just a legal way to derive from std::vector.

                – Max Langhof
                Apr 17 at 17:03
















              19
















              Have a look at this contrived (admittedly nonsensical) example with std::vector:



              template <class T>
              struct Example : private std::vector<T>
              void doStuff(const T& t) this->push_back(t);
              T retrieveStuff() return this->operator[](0);
              ;

              Example<int> e;

              e.doStuff(42);
              std::cout << e.retrieveStuff() << "n";


              This works, you can't get into UB due to std::vector::~vector not being virtual because you can't delete an object through a base class pointer (public inheritance is needed there).



              The inheritance here is just an implementation detail. Not recommended practice, but people probably did and do this. Once the decision is made to not break existing code by making std::vector or other container types final, it makes sense to stick to that with different vocabulary types like std::promise or std::future.






              share|improve this answer




















              • 1





                It is cleaner to do inheritance if you're exposing base functions via using. That could help you to avoid reimplementing an operator[] that only refers to member[] for every possible case.

                – Mirko
                Apr 17 at 12:21











              • Also, you could extend functionality as in your example using public inheritance, given that you don't add any members that change the size of the class.

                – Mirko
                Apr 17 at 12:27






              • 3





                @Mirko The example is intended to only show some non-ill-formed, non-UB use case related to the OP's question. And public inheritance opens the door for UB, as it allows invoking the non-virtual destructor..

                – lubgr
                Apr 17 at 12:28






              • 7





                @Mirko "there's no problem invoking base class non virtual destructor" really? Or is it that it appears fine all the times you tried?

                – Caleth
                Apr 17 at 14:41






              • 2





                @Mirko You can add semantics to a derived class that require calling the proper destructor, without increasing the size of the class, so your static_assert is not necessarily sufficient. And in any case, the point of the answer was not to show the best way to inherit from something, just a legal way to derive from std::vector.

                – Max Langhof
                Apr 17 at 17:03














              19














              19










              19









              Have a look at this contrived (admittedly nonsensical) example with std::vector:



              template <class T>
              struct Example : private std::vector<T>
              void doStuff(const T& t) this->push_back(t);
              T retrieveStuff() return this->operator[](0);
              ;

              Example<int> e;

              e.doStuff(42);
              std::cout << e.retrieveStuff() << "n";


              This works, you can't get into UB due to std::vector::~vector not being virtual because you can't delete an object through a base class pointer (public inheritance is needed there).



              The inheritance here is just an implementation detail. Not recommended practice, but people probably did and do this. Once the decision is made to not break existing code by making std::vector or other container types final, it makes sense to stick to that with different vocabulary types like std::promise or std::future.






              share|improve this answer













              Have a look at this contrived (admittedly nonsensical) example with std::vector:



              template <class T>
              struct Example : private std::vector<T>
              void doStuff(const T& t) this->push_back(t);
              T retrieveStuff() return this->operator[](0);
              ;

              Example<int> e;

              e.doStuff(42);
              std::cout << e.retrieveStuff() << "n";


              This works, you can't get into UB due to std::vector::~vector not being virtual because you can't delete an object through a base class pointer (public inheritance is needed there).



              The inheritance here is just an implementation detail. Not recommended practice, but people probably did and do this. Once the decision is made to not break existing code by making std::vector or other container types final, it makes sense to stick to that with different vocabulary types like std::promise or std::future.







              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Apr 17 at 11:05









              lubgrlubgr

              26.8k3 gold badges38 silver badges82 bronze badges




              26.8k3 gold badges38 silver badges82 bronze badges










              • 1





                It is cleaner to do inheritance if you're exposing base functions via using. That could help you to avoid reimplementing an operator[] that only refers to member[] for every possible case.

                – Mirko
                Apr 17 at 12:21











              • Also, you could extend functionality as in your example using public inheritance, given that you don't add any members that change the size of the class.

                – Mirko
                Apr 17 at 12:27






              • 3





                @Mirko The example is intended to only show some non-ill-formed, non-UB use case related to the OP's question. And public inheritance opens the door for UB, as it allows invoking the non-virtual destructor..

                – lubgr
                Apr 17 at 12:28






              • 7





                @Mirko "there's no problem invoking base class non virtual destructor" really? Or is it that it appears fine all the times you tried?

                – Caleth
                Apr 17 at 14:41






              • 2





                @Mirko You can add semantics to a derived class that require calling the proper destructor, without increasing the size of the class, so your static_assert is not necessarily sufficient. And in any case, the point of the answer was not to show the best way to inherit from something, just a legal way to derive from std::vector.

                – Max Langhof
                Apr 17 at 17:03













              • 1





                It is cleaner to do inheritance if you're exposing base functions via using. That could help you to avoid reimplementing an operator[] that only refers to member[] for every possible case.

                – Mirko
                Apr 17 at 12:21











              • Also, you could extend functionality as in your example using public inheritance, given that you don't add any members that change the size of the class.

                – Mirko
                Apr 17 at 12:27






              • 3





                @Mirko The example is intended to only show some non-ill-formed, non-UB use case related to the OP's question. And public inheritance opens the door for UB, as it allows invoking the non-virtual destructor..

                – lubgr
                Apr 17 at 12:28






              • 7





                @Mirko "there's no problem invoking base class non virtual destructor" really? Or is it that it appears fine all the times you tried?

                – Caleth
                Apr 17 at 14:41






              • 2





                @Mirko You can add semantics to a derived class that require calling the proper destructor, without increasing the size of the class, so your static_assert is not necessarily sufficient. And in any case, the point of the answer was not to show the best way to inherit from something, just a legal way to derive from std::vector.

                – Max Langhof
                Apr 17 at 17:03








              1




              1





              It is cleaner to do inheritance if you're exposing base functions via using. That could help you to avoid reimplementing an operator[] that only refers to member[] for every possible case.

              – Mirko
              Apr 17 at 12:21





              It is cleaner to do inheritance if you're exposing base functions via using. That could help you to avoid reimplementing an operator[] that only refers to member[] for every possible case.

              – Mirko
              Apr 17 at 12:21













              Also, you could extend functionality as in your example using public inheritance, given that you don't add any members that change the size of the class.

              – Mirko
              Apr 17 at 12:27





              Also, you could extend functionality as in your example using public inheritance, given that you don't add any members that change the size of the class.

              – Mirko
              Apr 17 at 12:27




              3




              3





              @Mirko The example is intended to only show some non-ill-formed, non-UB use case related to the OP's question. And public inheritance opens the door for UB, as it allows invoking the non-virtual destructor..

              – lubgr
              Apr 17 at 12:28





              @Mirko The example is intended to only show some non-ill-formed, non-UB use case related to the OP's question. And public inheritance opens the door for UB, as it allows invoking the non-virtual destructor..

              – lubgr
              Apr 17 at 12:28




              7




              7





              @Mirko "there's no problem invoking base class non virtual destructor" really? Or is it that it appears fine all the times you tried?

              – Caleth
              Apr 17 at 14:41





              @Mirko "there's no problem invoking base class non virtual destructor" really? Or is it that it appears fine all the times you tried?

              – Caleth
              Apr 17 at 14:41




              2




              2





              @Mirko You can add semantics to a derived class that require calling the proper destructor, without increasing the size of the class, so your static_assert is not necessarily sufficient. And in any case, the point of the answer was not to show the best way to inherit from something, just a legal way to derive from std::vector.

              – Max Langhof
              Apr 17 at 17:03






              @Mirko You can add semantics to a derived class that require calling the proper destructor, without increasing the size of the class, so your static_assert is not necessarily sufficient. And in any case, the point of the answer was not to show the best way to inherit from something, just a legal way to derive from std::vector.

              – Max Langhof
              Apr 17 at 17:03












              0
















              Absence of any virtual function in a class doesn't make it non-qualifiable as the Base class. In my opinion, adding virtual function(s) to the base class is kind of special case of making the base class as polymorphic. Many programmers careless put virtual to functions, and especially to the destructor of the class (and comment that "Virtual destructor is necessary").



              ATL, for example, relies heavily on inheritance but doesn't have any virtual functions. The (base) classes are non-polymorphic. Most (if not all) of the C++/STL classes are non-polymorphic.



              One may break the rule of "Prefer containment/composition over inheritance" and derive from a class in an illogical form (One example given by lubgr); but this is doable and is valid. Sometimes it is more appropriate to inherit from a non-polymorphic class, rather than containing a class.



              Template/Template-meta classes rely on inheritance where no virtual functions are involved. Attribute-inheritance is one example, where a class would inherit from various different classes (multi-inheritance), and inherit the attributes.



              One very simple example would be to make a class non_copyable, put copy-constructor/assignment-operator, etc as private/protected; and let other classes inherit from it. This way the "derived" class would inherit the non-copyable "capability/attribute" of the base class.






              share|improve this answer





























                0
















                Absence of any virtual function in a class doesn't make it non-qualifiable as the Base class. In my opinion, adding virtual function(s) to the base class is kind of special case of making the base class as polymorphic. Many programmers careless put virtual to functions, and especially to the destructor of the class (and comment that "Virtual destructor is necessary").



                ATL, for example, relies heavily on inheritance but doesn't have any virtual functions. The (base) classes are non-polymorphic. Most (if not all) of the C++/STL classes are non-polymorphic.



                One may break the rule of "Prefer containment/composition over inheritance" and derive from a class in an illogical form (One example given by lubgr); but this is doable and is valid. Sometimes it is more appropriate to inherit from a non-polymorphic class, rather than containing a class.



                Template/Template-meta classes rely on inheritance where no virtual functions are involved. Attribute-inheritance is one example, where a class would inherit from various different classes (multi-inheritance), and inherit the attributes.



                One very simple example would be to make a class non_copyable, put copy-constructor/assignment-operator, etc as private/protected; and let other classes inherit from it. This way the "derived" class would inherit the non-copyable "capability/attribute" of the base class.






                share|improve this answer



























                  0














                  0










                  0









                  Absence of any virtual function in a class doesn't make it non-qualifiable as the Base class. In my opinion, adding virtual function(s) to the base class is kind of special case of making the base class as polymorphic. Many programmers careless put virtual to functions, and especially to the destructor of the class (and comment that "Virtual destructor is necessary").



                  ATL, for example, relies heavily on inheritance but doesn't have any virtual functions. The (base) classes are non-polymorphic. Most (if not all) of the C++/STL classes are non-polymorphic.



                  One may break the rule of "Prefer containment/composition over inheritance" and derive from a class in an illogical form (One example given by lubgr); but this is doable and is valid. Sometimes it is more appropriate to inherit from a non-polymorphic class, rather than containing a class.



                  Template/Template-meta classes rely on inheritance where no virtual functions are involved. Attribute-inheritance is one example, where a class would inherit from various different classes (multi-inheritance), and inherit the attributes.



                  One very simple example would be to make a class non_copyable, put copy-constructor/assignment-operator, etc as private/protected; and let other classes inherit from it. This way the "derived" class would inherit the non-copyable "capability/attribute" of the base class.






                  share|improve this answer













                  Absence of any virtual function in a class doesn't make it non-qualifiable as the Base class. In my opinion, adding virtual function(s) to the base class is kind of special case of making the base class as polymorphic. Many programmers careless put virtual to functions, and especially to the destructor of the class (and comment that "Virtual destructor is necessary").



                  ATL, for example, relies heavily on inheritance but doesn't have any virtual functions. The (base) classes are non-polymorphic. Most (if not all) of the C++/STL classes are non-polymorphic.



                  One may break the rule of "Prefer containment/composition over inheritance" and derive from a class in an illogical form (One example given by lubgr); but this is doable and is valid. Sometimes it is more appropriate to inherit from a non-polymorphic class, rather than containing a class.



                  Template/Template-meta classes rely on inheritance where no virtual functions are involved. Attribute-inheritance is one example, where a class would inherit from various different classes (multi-inheritance), and inherit the attributes.



                  One very simple example would be to make a class non_copyable, put copy-constructor/assignment-operator, etc as private/protected; and let other classes inherit from it. This way the "derived" class would inherit the non-copyable "capability/attribute" of the base class.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Apr 18 at 6:54









                  AjayAjay

                  14.1k9 gold badges42 silver badges82 bronze badges




                  14.1k9 gold badges42 silver badges82 bronze badges































                      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%2f55725646%2fwhy-are-stdfuture-and-stdpromise-not-final%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

                      Tamil (spriik) Luke uk diar | Nawigatjuun

                      Align equal signs while including text over equalitiesAMS align: left aligned text/math plus multicolumn alignmentMultiple alignmentsAligning equations in multiple placesNumbering and aligning an equation with multiple columnsHow to align one equation with another multline equationUsing \ in environments inside the begintabularxNumber equations and preserving alignment of equal signsHow can I align equations to the left and to the right?Double equation alignment problem within align enviromentAligned within align: Why are they right-aligned?

                      Where does the image of a data connector as a sharp metal spike originate from?Where does the concept of infected people turning into zombies only after death originate from?Where does the motif of a reanimated human head originate?Where did the notion that Dragons could speak originate?Where does the archetypal image of the 'Grey' alien come from?Where did the suffix '-Man' originate?Where does the notion of being injured or killed by an illusion originate?Where did the term “sophont” originate?Where does the trope of magic spells being driven by advanced technology originate from?Where did the term “the living impaired” originate?