I am trying to inherit two equally named methods with different parameter lists to a derived class. One of them is virtual and overridden in the derived class, the other one is non-virtual. Doing so, i get a compile error while trying to access the non-virtual method of the base class from an derived class object.
Here is the code snippet
class Base {
public:
void f() {
cout << "[Base::f()]" << endl;
}
virtual void f(int arg) {
cout << "[Base::f(" << arg << ")]" << endl;
}
};
class Deriv : public Base {
public:
virtual void f(int arg) {
cout << "[Deriv::f(" << arg << ")]" << endl;
}
};
int main() {
Deriv d;
d.f(-1);
d.f(); // <<-- compile error
return 0;
}
which produces the following compile error:
error: no matching function for call to ‘Deriv::f()’
note: candidates are: virtual void Deriv::f(int)
I am not an expert in C++, but until now I thought to be right in making the assumption that member methods can be completely distinguished by their signatures. Thus, the non-virtual method Base::f() should not be overridden and should remain accessible. Am I wrong with this?
Here are some interesting/additional comments on that:
- - the overriding method Deriv::f(int arg) could be non-virtual as well;
the error occurs in either way
- the error disappears/can be circumvented...
- ... by casting the Deriv object to the Base class
... when not overriding Base::f(int arg) in Deriv
... by adding the command "Base::f;" to the public part of Deriv
So, since I already know how to avoid this compile error, I am mainly interested in why this error happens!
using Base::f;
? – Dentelle