#include <iostream>
#include <vector>
using namespace std;
template< typename Self>
class A {
public:
void foo( ) {
Self s;
( ( A< Self> &) s)._method( s);
}
protected:
virtual void _method( const Self & b) = 0;
};
class _B;
class B : public A< B> {
protected:
void _method( const B & b) { cout << "goo!"; }
};
int main() {
B().foo();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPCB0eXBlbmFtZSBTZWxmPgpjbGFzcyBBIHsKcHVibGljOgogICAgdm9pZCBmb28oICkgewogICAgCVNlbGYgczsKICAgICggKCBBPCBTZWxmPiAmKSBzKS5fbWV0aG9kKCBzKTsKICAgIH0KCnByb3RlY3RlZDoKICAgIHZpcnR1YWwgIHZvaWQgX21ldGhvZCggY29uc3QgU2VsZiAmIGIpID0gMDsKfTsKCmNsYXNzIF9COwoKCmNsYXNzIEIgOiBwdWJsaWMgQTwgQj4gewoKcHJvdGVjdGVkOgogICAgdm9pZCBfbWV0aG9kKCBjb25zdCBCICYgYikgeyBjb3V0IDw8ICJnb28hIjsgfQp9OwoKaW50IG1haW4oKSB7CiAgICBCKCkuZm9vKCk7CgoJcmV0dXJuIDA7Cn0=