A MODULE may contain a mixture of VIRTUAL and non-VIRTUAL members. The rules are:
ALL members are VIRTUAL if the MODULE has the VIRTUAL option or is an INTERFACE
A member is VIRTUAL if it is declared using the EXPORT VIRTUAL or SHARED VIRTUAL keywords
A member is VIRTUAL if the definition of the same name in the inherited module is VIRTUAL.
Some members can never be virtual -- RECORD structures.
All EXPORTed and SHARED members of an inherited abstract module can be overridden by re-defining them in the current instance, whether that current instance is abstract or concrete. Overridden definitions must exactly match the type and parameters of the inherited members. Multiple inherited interfaces may contain definitions with the same name if they are the same type and receive the same parameters, but if those inherited members have different values defined for them, the conflict must be resolved by overriding that member in the current instance.