#include <iostream>
struct Base {
enum Type {
FOO = 0,
BAR = 1
};
virtual ~Base() {}
virtual Type type() const = 0;
int value_;
};
struct Foo : Base {
Foo() { value_ = 33; }
virtual Type type() const { return FOO; }
};
struct Bar : Base {
Bar() { value_ = 44; }
virtual Type type() const { return BAR; }
};
int main() {
Foo foo;
Bar bar;
Base & b = foo;
std::cout << b.type() << ", " << b.value_ << "\n";
b = bar;
std::cout << b.type() << ", " << b.value_ << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnN0cnVjdCBCYXNlIHsKICBlbnVtIFR5cGUgewogICAgRk9PID0gMCwKICAgIEJBUiA9IDEKICB9OwogIHZpcnR1YWwgfkJhc2UoKSB7fQogIHZpcnR1YWwgVHlwZSB0eXBlKCkgY29uc3QgPSAwOwogIGludCB2YWx1ZV87Cn07CiAKc3RydWN0IEZvbyA6IEJhc2UgeyAKICAgIEZvbygpIHsgdmFsdWVfID0gMzM7IH0KICAgIHZpcnR1YWwgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gRk9POyB9Cn07CiAKc3RydWN0IEJhciA6IEJhc2UgeyAKICAgIEJhcigpIHsgdmFsdWVfID0gNDQ7IH0KICAgIHZpcnR1YWwgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gQkFSOyB9Cn07CiAKaW50IG1haW4oKSB7CiAgICBGb28gZm9vOwogICAgQmFyIGJhcjsKICAgIEJhc2UgJiBiID0gZm9vOwogICAgc3RkOjpjb3V0IDw8IGIudHlwZSgpIDw8ICIsICIgPDwgYi52YWx1ZV8gPDwgIlxuIjsKICAgIGIgPSBiYXI7CiAgICBzdGQ6OmNvdXQgPDwgYi50eXBlKCkgPDwgIiwgIiA8PCBiLnZhbHVlXyA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0K