Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Confused about virtual overloaded functions [duplicate]

I am confused about compiler errors regarding the code below:

class Base {
public:
  virtual ~Base () { }
  virtual void func () { }
  virtual void func (int) { }
  virtual void another () { }
  virtual void another (int) { }
};

class Derived : public Base {
public:
  void func () { }
};

int main () {
  Derived d;
  d.func();
  d.func(0);
  d.another();
  d.another(0);
}

Using gcc 4.6.3, the above code causes an error at d.func(0) saying that Dervied::func(int) is undefined.

When I also add a definition for func(int) to Derived, then it works. It also works (as in the case of "another") when I define neither func() nor func(int) in Derived.

Clearly there is some rule going on here regarding virtual overloaded functions, but this is the first time I've encountered it, and I don't quite understand it. Can somebody tell me what exactly is going on here?

like image 861
Jason C Avatar asked Dec 20 '22 05:12

Jason C


1 Answers

When you override func() in Derived, this hides func(int).

gcc can warn you about this:

$ g++ -Wall -Woverloaded-virtual test.cpp
test.cpp:5:16: warning: 'virtual void Base::func(int)' was hidden [-Woverloaded-virtual]
test.cpp:12:8: warning:   by 'virtual void Derived::func()' [-Woverloaded-virtual]

You can fix this with using:

class Derived : public Base {
public:
  using Base::func;
  void func () { }
};

For a discussion of why this happens, see Why does an overridden function in the derived class hide other overloads of the base class?

like image 72
NPE Avatar answered Dec 24 '22 02:12

NPE