The property of object-oriented programming languages where the code executed to perform a given operation is determined at run time from the class of the operand(s) (the receiver of the message). There may be several different classes of objects which can receive a given message. An expression may denote an object which may have more than one possible class and that class can only be determined at run time. New classes may be created that can receive a particular message, without changing (or recompiling) the code which sends the message. An class may be created that can receive any set of existing messages.
C++ implements dynamic binding using "virtual member functions".
One important reason for having dynamic binding is that it provides a mechanism for selecting between alternatives which is arguably more robust than explicit selection by conditionals or pattern matching. When a new subclass is added, or an existing subclass changes, the necessary modifications are localised: you don't have incomplete conditionals and broken patterns scattered all over the program.