Assembly to C: procedures, loops, switch-case, expanded numeric constants (e.g. seconds in a week as 606024*7 rather than 6048000).
C to C++: virtual methods, scope-delimited allocation, dynamic typing.
C to C++: virtual methods, scope-delimited allocation, dynamic typing.
Of course, if a function definition is a pattern, does that mean that Lisp (chock-full of function definitions) is a lower-level language than Prolog (which doesn't need functions at all and therefore abstracts away that whole idea)?