Option (c) is correct.
Function overloading is static or compile-time binding whereas function overriding is dynamic or run-time binding. The reason is that in overloading, two functions sharing the same name have different set of parameters (function signature) and with that different signature, the compiler can easily identify to which function is this call associated. So compile-time bnding is possible and is preferred. In contrast, overriden functions always have exactly same signature in the derived class. So the decision is deferred until run-time, where the JVM decides which function to bind to the call.
Option (d) is also correct. Overrriding applies to derived classes whereas overloading applies to functions in the same class or friend classes. Overloading in same class is obvious, but how it applies to friend classes is given in the example below:
class Rectangle{
int width, height;
public:
int area() {return (width * height);}
};
class Square{
friend class Rectangle;
private:
int side;
public:
Square (int a) : side(a) {}
int area(int a) : side(a) {return (a * a);}
};
Here, class Rectangle is a friend of class Square. So a non-member function of Rectangle can have access to all private and protected data / functions of class Square. The function area() is overloaded in the friend class Rectangle.
Thus the correct answers are (c) and (d).