but why X11 got by without doing this and so did ncurses.
X11, ncurses, and GTK each do completely different things. Structural dissimilarity should be unexpected.
Differences in program implementation are much more a function of the programmer(s) involved than the language(s) involved. You can write C-like code in C++, you can write C++-like code in C. You can write Haskell-like code in both with enough boilerplate.
Between possibility and practice lies a gulf as deep and as broad as that between practice and perfection. I can play baseball, but the difference between me and a baseball player is significant. Calling a conversation vacuous because it concerns the real differences between languages, is contrarianism at its least useful.