Search code examples
c++virtualderived-class

Why is 'virtual' optional for overridden methods in derived classes?


When a method is declared as virtual in a class, its overrides in derived classes are automatically considered virtual as well, and the C++ language makes this keyword virtual optional in this case:

class Base {
    virtual void f();
};
class Derived : public Base {
    void f(); // 'virtual' is optional but implied.
};

My question is: What is the rationale for making virtual optional?

I know that it is not absolutely necessary for the compiler to be told that, but I would think that developers would benefit if such a constraint was enforced by the compiler.

E.g., sometimes when I read others' code I wonder if a method is virtual and I have to track down its superclasses to determine that. And some coding standards (Google) make it a 'must' to put the virtual keyword in all subclasses.


Solution

  • Yeah, it would really be nicer to make the compiler enforce the virtual in this case, and I agree that this is a error in design that is maintained for backwards compatibility.

    However there's one trick that would be impossible without it:

    class NonVirtualBase {
      void func() {};
    };
    
    class VirtualBase {
      virtual void func() = 0;
    };
    
    template<typename VirtualChoice>
    class CompileTimeVirtualityChoice : public VirtualChoice {
      void func() {}
    };
    

    With the above we have compile time choice wether we want virtuality of func or not:

    CompileTimeVirtualityChoice<VirtualBase> -- func is virtual
    CompileTimeVirtualityChoice<NonVirtualBase> -- func is not virtual
    

    ... but agreed, it's a minor benefit for the cost of seeking a function's virtuality, and myself, I always try to type virtual everywhere where applicable.