The type of the most derived object to which an expression refers is said to be the dynamic type of that expression. For example, if p is declared as a pointer to class B and it’s actually pointing to an object of class D (when D is derived from B), the dynamic type of the expression “*p” is “D”. References are treated similarly. For example:
void func( B * p) // the static type of "*p" is "B" { D d = *p; // however, the dynamic type of "*p" is "D" } int main { D d; func( &d); }
The dynamic type of an expression is determined at runtime whereas its static type is determined at compile-time.