Double dispatch in C++