C++ Forcing Method Override In Concrete Class

后端 未结 5 2426

Is there a way in C++ to write a concrete class which when another class is derived from it, has a method which must be overriden. An abstract class allows the forcing of the de

5条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-02-20 06:39

    I will assume you are looking for a compile-time enforcing of this condition (thank you @Chad for pointing it out)

    There is no direct language-mechanism in C++ that I know of. I mean, there is not a reserved keyword to put in front of your method declaration that would achieve your desired goal.

    I think that what you say is pointing to a design problem in your software. Let's say you want to force the foo() method to be reimplemented by all inherirhing classes in the following snippet

    class BaseButConcrete
    {
        ... //Common stuff
        ... //
    
        virtual void foo()
        { /*implementation that you do not want to be inherited, but will be...*/ }
    }
    
    class DerivedOtherConcrete : public BaseButConcrete
    {
        void foo()
        { /*different implementation, 
          but no obligation from compiler point of view*/ }
    }
    

    I can see no good design reason why all the common stuff could not be moved in an abstract base class. From what you describe, you do not want to inherit the foo implementation in Derived, so do not inherit that part ! Thus the very classic design should do the trick :

    class AbstractBase
    {
        ... //Common stuff has moved here
        ... //
        virtual void foo() =0;
    }
    
    class NotAnymoreBaseButStillConcrete : public AbstractBase
    {
        void foo()
        { /*implementation that should not be inherited,
          and that will not by design*/ }
    }
    
    class DerivedOtherConcrete : public AbstractBase
    {
        void foo()
        { /*different implementation, 
          now mandatory compiler-wise for the class to be concrete*/ }
    }
    

    This way, the common stuff is still shared among all your derived classes, and you keep what you do not want to inherit (i.e. the foo implementation) separated in classes not on the same inheritance path.

提交回复
热议问题