C++. In C++ you don't pay for features you don't use (and it is easy to avoid them!). At a minimum, you can use C++ as "super-C" with better namespace control (by using non-virtual member functions or namespaces), usable const, overloaded methods, and default arguments. All of those features are essentially free, they make your code easier to develop, easier to read, and less buggy. That leaves you the option of using additional features if you need them. In particular, simple inheritance with virtual methods does add some overhead, no more (and often less) than if you implemented the same in C with explicit dispatch tables.
Templates, exceptions, and RTTI are features more likely to cause unacceptable overhead, but you can always just not use them, or you can use them carefully.
The argument that you might accidentally do something that causes your executable to double in size is not really credible. Sure it might happen, but that is usually because you were saving a lot of time compared to doing something the hard way in C. If you have to go back and fix it, you are usually not going to be much worse than if you had done things the hard way the first time.
Also, it is certainly possible to accidentally create bloat in C programs. Allocating large arrays on the stack, Passing/returning structures by value, excessive inlining all spring to mind.
C++ traditionally lacked good compilers, especially in the embedded world. In particular, there used to be a lot of embedded C++ compilers didn't achieve the promise of "no overhead for features you don't use", especially with exceptions. If the C++ compiler for your platform sucks, that is a great reason to stick with C. Otherwise, C++ really has no downsides.