#include <iostream>

class Base {
	public:
	Base(int v) : x(v) {}
	virtual Base operator +(Base& other) {
		std::cout << "Base::operator +\n";
		return Base(x + other.x);
	}
	int x;
};

class Derived: public Base {
	public:
	Derived(int v) : Base(v) {}
	Base operator +(Base& other) override {
		std::cout << "Derived::operator +\n";
		return Base(x + other.x);
	}
};

Base polym(Base& left, Base& right) {
	return left + right;
}

int main() {
	Base b(2);
	Derived d(3);
	polym(b, d);
	polym(d, b);
	return 0;
}