#include <iostream>
using namespace std;
class A;
class B;
class C;
class A
{
public:
void Testme(A& other)
{
cout << "value from this: " << Value() << " value from other: " << other.Value();
}
protected:
virtual char const* Value() = 0;
};
class B : public A
{
protected:
char const* Value()
{
return "B class";
}
};
class C : public A
{
protected:
char const* Value()
{
return "C class";
}
};
int main() {
B b = B();
C c = C();
b.Testme(c);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQTsKY2xhc3MgQjsKY2xhc3MgQzsKCmNsYXNzIEEKewoJcHVibGljOgoJCXZvaWQgVGVzdG1lKEEmIG90aGVyKQoJCXsKCQkJY291dCA8PCAidmFsdWUgZnJvbSB0aGlzOiAiIDw8IFZhbHVlKCkgPDwgIiB2YWx1ZSBmcm9tIG90aGVyOiAiIDw8IG90aGVyLlZhbHVlKCk7CgkJfQoJCglwcm90ZWN0ZWQ6CgkJdmlydHVhbCBjaGFyIGNvbnN0KiBWYWx1ZSgpID0gMDsKfTsKCmNsYXNzIEIgOiBwdWJsaWMgQQp7Cglwcm90ZWN0ZWQ6CgkJY2hhciBjb25zdCogVmFsdWUoKQoJCXsKCQkJcmV0dXJuICJCIGNsYXNzIjsKCQl9Cn07CgpjbGFzcyBDIDogcHVibGljIEEKewoJcHJvdGVjdGVkOgoJCWNoYXIgY29uc3QqIFZhbHVlKCkKCQl7CgkJCXJldHVybiAiQyBjbGFzcyI7CgkJfQp9OwoKaW50IG1haW4oKSB7CglCIGIgPSBCKCk7CglDIGMgPSBDKCk7CgliLlRlc3RtZShjKTsKCXJldHVybiAwOwp9