Errors are only issued when the compiler cannot continue because something went terribly wrong.
When calling a method in Objective-C, the method lookup is done during runtime and not during compilation, which C++ does. In Objective-C a "message" is simply sent to the object, something like
obj.executeCommand("Hey, can you execute function <name> for me?"). In C++ the object will be called directly, in a way like
obj.<name>(). In the case of Objective-C the executeCommand() method is called, which exists. In C++'s case the function is called but it does not exist. These are methods that are linked on the compiler level, which means they both become memory addresses rather than names.
executeCommand becomes 0x12345678 but it still uses the same message (
"execute function <name>").
This is probably very confusing, but it's related to the way methods are implemented in different languages.