overloading base class method in derived class

40,158

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.

Share:
40,158
dau_sama
Author by

dau_sama

Updated on May 31, 2020

Comments

  • dau_sama
    dau_sama almost 4 years

    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.

  • dau_sama
    dau_sama almost 11 years
    myDerived.method_A(1,2); should call the base class method. I agree, I wanted to say overload
  • dau_sama
    dau_sama almost 11 years
    as said in other comments, I actually did want to overload