#include <iostream>
class Base { };
class AnotherBase { };
class Derv : public Base{ };
class Derv2 : public Base { };
class DervDerv : public Derv { };
void f(const Base &b)
{
printf("b(Base)\n");
}
void f(const Derv &b)
{
printf("b(Derv)\n");
}
template<class T> void f(const T& t)
{
printf("b(template)\n");
}
int main() {
f(Base());
f(AnotherBase());
f(Derv());
f(Derv2());
f(DervDerv());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQmFzZSB7IH07CmNsYXNzIEFub3RoZXJCYXNlIHsgfTsKCmNsYXNzIERlcnYgOiBwdWJsaWMgQmFzZXsgfTsKCmNsYXNzIERlcnYyIDogcHVibGljIEJhc2UgeyB9OwoKY2xhc3MgRGVydkRlcnYgOiBwdWJsaWMgRGVydiB7IH07Cgp2b2lkIGYoY29uc3QgQmFzZSAmYikKewogIHByaW50ZigiYihCYXNlKVxuIik7Cn0KCnZvaWQgZihjb25zdCBEZXJ2ICZiKQp7CiAgcHJpbnRmKCJiKERlcnYpXG4iKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBmKGNvbnN0IFQmIHQpCnsKICBwcmludGYoImIodGVtcGxhdGUpXG4iKTsgCQp9CgppbnQgbWFpbigpIHsKCWYoQmFzZSgpKTsKCWYoQW5vdGhlckJhc2UoKSk7CglmKERlcnYoKSk7CglmKERlcnYyKCkpOwoJZihEZXJ2RGVydigpKTsKCQoJcmV0dXJuIDA7Cn0=