You are missing a detail here: virtual tables are an implementation detail. As a result:
- the Standard defines polymorphic classes as classes that can be used in a polymorphic sense: ie, where behavior can be overriden
- compilers use virtual tables to implement some features/behaviors mandated by the Standard, which happen to include both polymorphic classes AND virtual bases.
Thus, yes the compilers I know (MSVC and those following the Itanium ABI such as gcc, icc and Clang) will use virtual tables to provide the RTTI necessary for dynamic_cast
to work in the presence of virtual bases... and no this has nothing to do really with whether a class is polymorphic or not.
On a tangent, though, Prefer Composition Over Inheritance implies that there is little reason to inherit from a class if there is no behavior that can be overriden.