#include <iostream>
using namespace std;

struct Base {
	Base operator+(const Base& other) {
		return add(other);
	}
protected:
    virtual Base add(const Base& other) {
    	cout << "Adding in Base's code." << endl;
    	return Base();
    }
};

struct Derived : public Base {
protected:
    virtual Base add(const Base& other) {
    	cout << "Adding in Derived's code." << endl;
    	return Derived();
    }
};

int main() {
	Base b1;
	Base b2;
	Derived d1;
	Derived d2;
	Base res;
	res = b1+b2;
	res = b1+d2;
	res = d1+b2;
	res = d1+d2;
	return 0;
}