#include <iostream>
#include <vector>
using namespace std;
struct A {
virtual void print(){ cout << "A\n"; }
void output(){ cout << "A\n"; }
};
struct B : public A {
virtual void print(){ cout << "B\n"; }
void output(){ cout << "B\n"; }
};
struct C : public A {
virtual void print(){ cout << "C\n"; }
void output(){ cout << "C\n"; }
};
struct B1 : public B {
virtual void print(){ cout << "B1\n"; }
void output(){ cout << "B1\n"; }
};
struct B2 : public B {
virtual void print(){ cout << "B2\n"; }
void output(){ cout << "B2\n"; }
};
struct C1 : public C {
virtual void print(){ cout << "C1\n"; }
void output(){ cout << "C1\n"; }
};
struct C11 : public C1 {
virtual void print(){ cout << "C11\n"; }
void output(){ cout << "C11\n"; }
};
int main() {
vector<A*> children_;
A a;
B b;
B1 b1;
B2 b2;
C c;
C1 c1;
C11 c11;
children_.push_back(&a);
children_.push_back(&b);
children_.push_back(&b1);
children_.push_back(&b2);
children_.push_back(&c);
children_.push_back(&c1);
children_.push_back(&c11);
for(auto& i : children_) {
i->print();
i->output();
if(dynamic_cast<B*>(i) != nullptr) {
if(dynamic_cast<B1*>(i) != nullptr) {
static_cast<B1*>(i)->output();
} else if(dynamic_cast<B2*>(i) != nullptr) {
static_cast<B2*>(i)->output();
} else {
static_cast<B*>(i)->output();
}
} else if(dynamic_cast<C*>(i) != nullptr) {
if(dynamic_cast<C1*>(i) != nullptr) {
if(dynamic_cast<C11*>(i) != nullptr) {
static_cast<C11*>(i)->output();
} else {
static_cast<C1*>(i)->output();
}
} else {
static_cast<C*>(i)->output();
}
} else {
i->output();
}
cout << endl;
}
}