#include <iostream> using namespace std; class Base { public: virtual void doSomething(double a) { cout << "This is double from Base: " << a << endl; } virtual void doSomething(int a) { cout << "This is int from Base: " << a << endl; } virtual ~Base() {} }; class Derived : public Base { public: virtual void doSomething(double a) { cout << "This is double from Derived: " << a << endl; } virtual ~Derived() {} }; int main() { Derived d; int i = 2; double j = 0.1; d.doSomething(i); d.doSomething(j); return 0; }We would expect the output to be:
This is int from Base: 2 This is double from Derived: 0.1
Strangely, the output is:
This is double from Derived: 2 This is double from Derived: 0.1
The way overload resolution works in C++ is that the compiler will first search for function doSomething() inside the Derived class. If it finds it, it will stop there; otherwise it will look the one in the Base class for a matching function. To solve this problem, we need to add using Base::doSomething in order let it participate in the overload resolution.
#include <iostream> using namespace std; class Base { public: virtual void doSomething(double a) { cout << "This is double from Base: " << a << endl; } virtual void doSomething(int a) { cout << "This is int from Base: " << a << endl; } virtual ~Base() {} }; class Derived : public Base { public: virtual void doSomething(double a) { cout << "This is double from Derived: " << a << endl; } using Base::doSomething; virtual ~Derived() {} }; int main() { Derived d; int i = 2; double j = 0.1; d.doSomething(i); d.doSomething(j); return 0; }
The output is:
This is int from Base: 2 This is double from Derived: 0.1