add final/override keyword where possible to help compiler de-virtualize function calls