How to specify the size of a class array ?

The compiler implicitly marking functions as weak is different to explicitly using a function modifier, may not be portable either.

The serial case usage is not used on a template, and is there to stop multiple definition errors and allow the user to implement the body of serialEvent in their own code.

The hardwareSerial.cpp file is compiled first so without having a weak definition that the linker can throw away, it would have an 'unresolved external. When your sketch is compiled with a new function body, the linker will select it and discard all the others.