Why should virtual functions not be used excessively?

前端 未结 10 2067
再見小時候
再見小時候 2021-02-19 13:16

I just read that we should not use virtual function excessively. People felt that less virtual functions tends to have fewer bugs and reduces maintenance.

What kind of b

10条回答
  •  爱一瞬间的悲伤
    2021-02-19 13:39

    Virtual functions are slightly slower than regular functions. But that difference is so small as to not make a difference in all but the most extreme circumstances.

    I think the best reason to eschew virtual functions is to protect against interface misuse.

    It's a good idea to write classes to be open for extension, but there's such a thing as too open. By carefully planning which functions are virtual, you can control (and protect) how a class can be extended.

    The bugs and maintenance problems appear when a class is extended such that it breaks the contract of the base class. Here's an example:

    class Widget
    {
        private WidgetThing _thing;
    
        public virtual void Initialize()
        {
            _thing = new WidgetThing();
        }
    }
    
    class DoubleWidget : Widget
    {
        private WidgetThing _double;
    
        public override void Initialize()
        {
            // Whoops! Forgot to call base.Initalize()
            _double = new WidgetThing();
        }
    }
    

    Here, DoubleWidget broke the parent class because Widget._thing is null. There's a fairly standard way to fix this:

    class Widget
    {
        private WidgetThing _thing;
    
        public void Initialize()
        {
            _thing = new WidgetThing();
            OnInitialize();
        }
    
        protected virtual void OnInitialize() { }
    }
    
    class DoubleWidget : Widget
    {
        private WidgetThing _double;
    
        protected override void OnInitialize()
        {
            _double = new WidgetThing();
        }
    }
    

    Now Widget won't run into a NullReferenceException later.

提交回复
热议问题