Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Override and overload in C++

Yes, I do understand the difference between them. What I want to know is: why OVERRIDE a method? What is the good in doing it? In case of overload: the only advantage is you haven't to think in different names to functions?

like image 341
Hai Avatar asked Jan 09 '09 18:01

Hai


People also ask

What is overloading and overriding in C?

Overloading is determined at compile time and is static. Overriding is determined at runtime and is dynamic. Overloading concerns giving a method with the same name different parameters. Overriding concerns defining a different implementation of the same method in inherited classes.

What is the difference between override and overload?

What is Overloading and Overriding? When two or more methods in the same class have the same name but different parameters, it's called Overloading. When the method signature (name and parameters) are the same in the superclass and the child class, it's called Overriding.

What is difference between overloaded functions and overridden function?

Which of the following differentiates between overloaded functions and overridden functions? (A) Overloading is a dynamic or runtime binding and overridden is a static or compile time binding.


1 Answers

Overloading generally means that you have two or more functions in the same scope having the same name. The function that better matches the arguments when a call is made wins and is called. Important to note, as opposed to calling a virtual function, is that the function that's called is selected at compile time. It all depends on the static type of the argument. If you have an overload for B and one for D, and the argument is a reference to B, but it really points to a D object, then the overload for B is chosen in C++. That's called static dispatch as opposed to dynamic dispatch. You overload if you want to do the same as another function having the same name, but you want to do that for another argument type. Example:

void print(Foo const& f) {     // print a foo }  void print(Bar const& bar) {     // print a bar } 

they both print their argument, so they are overloaded. But the first prints a foo, and the second prints a bar. If you have two functions that do different things, it's considered bad style when they have the same name, because that can lead to confusion about what will happen actually when calling the functions. Another usecase for overloading is when you have additional parameters for functions, but they just forward control to other functions:

void print(Foo & f, PrintAttributes b) {      /* ... */  }  void print(Foo & f, std::string const& header, bool printBold) {     print(f, PrintAttributes(header, printBold)); } 

That can be convenient for the caller, if the options that the overloads take are often used.

Overriding is something completely different. It doesn't compete with overloading. It means that if you have a virtual function in a base class, you can write a function with the same signature in the derived class. The function in the derived class overrides the function of the base. Sample:

struct base {     virtual void print() { cout << "base!"; } }  struct derived: base {     virtual void print() { cout << "derived!"; } } 

Now, if you have an object and call the print member function, the print function of the derived is always called, because it overrides the one of the base. If the function print wasn't virtual, then the function in the derived wouldn't override the base function, but would merely hide it. Overriding can be useful if you have a function that accepts a base class, and every one that's derived from it:

void doit(base &b) {     // and sometimes, we want to print it     b.print(); } 

Now, even though at compile time the compiler only knows that b is at least base, print of the derived class will be called. That's the point of virtual functions. Without them, the print function of the base would be called, and the one in the derived class wouldn't override it.

like image 139
Johannes Schaub - litb Avatar answered Oct 06 '22 18:10

Johannes Schaub - litb