Function overloading allows multiple functions to have the same name but different parameters within a class. Function overriding occurs when a function in a derived class has the same name and signature as a function in the base class. Overloading deals with functions within a class, while overriding deals with functions in a parent-child class relationship. The compiler determines which function to call based on the parameters passed. Making functions virtual allows for dynamic binding so the correct overriding function is called based on the object type.