#include <iostream>
struct A {
int i;
virtual void describe() {
std::cout << "A:" << i << std::endl;
}
};
struct B : public A {
char c;
virtual void describe() override {
// Assume a 'B' wants to also output the A stuff.
std::cout << "B:" << c << ":";
A::describe();
}
};
struct C : public B {
float f;
virtual void describe() override {
// Assume a 'C' wants to also output the B stuff and A stuff.
std::cout << "C:" << f << ":";
B::describe();
}
};
#include <vector>
int main() {
std::vector<A*> bar;
A a;
a.i = 10;
B b;
b.i = 22;
b.c = 'b';
C c;
c.i = 5;
c.c = 'X';
c.f = 123.456;
bar.push_back(&a);
bar.push_back(&b);
bar.push_back(&c);
for (size_t i = 0; i < bar.size(); ++i) {
bar[i]->describe();
}
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICBzdHJ1Y3QgQSB7CiAgICAgICAgaW50IGk7CiAgICAgICAgdmlydHVhbCB2b2lkIGRlc2NyaWJlKCkgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkE6IiA8PCBpIDw8IHN0ZDo6ZW5kbDsKICAgICAgICB9CiAgICB9OwogICAgc3RydWN0IEIgOiBwdWJsaWMgQSB7CiAgICAgICAgY2hhciBjOwogICAgICAgIHZpcnR1YWwgdm9pZCBkZXNjcmliZSgpIG92ZXJyaWRlIHsKICAgICAgICAgICAgLy8gQXNzdW1lIGEgJ0InIHdhbnRzIHRvIGFsc28gb3V0cHV0IHRoZSBBIHN0dWZmLgogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkI6IiA8PCBjIDw8ICI6IjsKICAgICAgICAgICAgQTo6ZGVzY3JpYmUoKTsKICAgICAgICB9CiAgICB9OwogICAgc3RydWN0IEMgOiBwdWJsaWMgQiB7CiAgICAgICAgZmxvYXQgZjsKICAgICAgICB2aXJ0dWFsIHZvaWQgZGVzY3JpYmUoKSBvdmVycmlkZSB7CiAgICAgICAgICAgIC8vIEFzc3VtZSBhICdDJyB3YW50cyB0byBhbHNvIG91dHB1dCB0aGUgQiBzdHVmZiBhbmQgQSBzdHVmZi4KICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJDOiIgPDwgZiA8PCAiOiI7CiAgICAgICAgICAgIEI6OmRlc2NyaWJlKCk7CiAgICAgICAgfQogICAgfTsKCiAgICAjaW5jbHVkZSA8dmVjdG9yPgoKICAgIGludCBtYWluKCkgewogICAgICAgIHN0ZDo6dmVjdG9yPEEqPiBiYXI7CiAgICAgICAgQSBhOwogICAgICAgIGEuaSA9IDEwOwogICAgICAgIEIgYjsKICAgICAgICBiLmkgPSAyMjsKICAgICAgICBiLmMgPSAnYic7CiAgICAgICAgQyBjOwogICAgICAgIGMuaSA9IDU7CiAgICAgICAgYy5jID0gJ1gnOwogICAgICAgIGMuZiA9IDEyMy40NTY7CiAgICAgICAgYmFyLnB1c2hfYmFjaygmYSk7CiAgICAgICAgYmFyLnB1c2hfYmFjaygmYik7CiAgICAgICAgYmFyLnB1c2hfYmFjaygmYyk7CiAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiYXIuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgYmFyW2ldLT5kZXNjcmliZSgpOwogICAgICAgIH0KICAgIH0K