Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

overloading base class method in derived class

I am trying to understand why the following code does not compile, apparently the solution relies in specifically declaring the dependency on method_A in the derived class. Please refer to the following code:

class Base {   public:      void method_A(int param, int param2)     {       std::cout << "Base call A" << std::endl;     }  };  //does not compile class Derived : public Base {   public:      void method_A(int param)     {       std::cout << "Derived call A" << std::endl;     } };  //compiles class Derived2 : public Base {   public:     using Base::method_A; //compile     void method_A(int param)     {       std::cout << "Derived call A" << std::endl;     } };  int main () {   Derived myDerived;   myDerived.method_A(1);   myDerived.method_A(1,2);    Derived2 myDerived2;   myDerived2.method_A(1);   myDerived2.method_A(1,2);   return 0; } 

"test.cpp", (S) The wrong number of arguments have been specified for "Derived::method_A(int)".

What is the technical reason that prevents the derived class to know its base class is implementing the method it's trying to overload? I am looking in understanding better how the compiler/linker behaves in this case.

like image 923
dau_sama Avatar asked May 30 '13 12:05

dau_sama


People also ask

Can we overload method in derived class?

In C#, just like in C++, there is no overload resolution between class Base and class Derived. Also, there is no overloading across scopes and derived class scopes are not an exception to this general rule.

Can base class access methods of derived class?

base (C# Reference)The base keyword is used to access members of the base class from within a derived class: Call a method on the base class that has been overridden by another method. Specify which base-class constructor should be called when creating instances of the derived class.

Are overloaded operators inherited in the derived class?

All overloaded operators except assignment (operator=) are inherited by derived classes.

How do you call a base class method from a derived class?

Using a qualified-id to call a base class' function works irrespectively of what happens to that function in the derived class - it can be hidden, it can be overridden, it can be made private (by using a using-declaration), you're directly accessing the base class' function when using a qualified-id.


1 Answers

Its called Name Hiding. When you define a non virtual method with the same name as Base method it hides the Base class method in Derived class so you are getting the error for

 myDerived.method_A(1,2); 

To avoid hiding of Base class methods in Derived class use using keyword as you did in Derived2 class.

Also if you want to make it work you can do it explictly

myDerived.Base::method_A(1,2); 

Check out this for better explanation why name hiding came into picture.

like image 79
Daemon Avatar answered Sep 18 '22 23:09

Daemon