Syntax of Virtual Functions
Specifying the keyword virtual for any base class member
function enables dynamic binding for that function.
Any derived class can override that function by defining a
function with the same signature and return type.
The keyword virtual does not need to be re-specified within
the derived class.
Once a member function is declared to be virtual in a base
class, all functions with that name, signature, and return
type in any derived class remain virtual and can be
overridden.