#include <stdio.h>
class A {
public:
A() : next(0) {
if (head == 0) {
head = this;
} else {
A* step = head;
while (step->next != 0) {
step = step->next;
}
step->next = this;
}
}
virtual ~A() {
if (head == this) {
head = 0;
} else {
A* step = head;
while (step->next != this) {
step = step->next;
}
step->next = next;
}
}
static A* head;
A* next;
};
class B : public A {
public:
B() {}
virtual ~B() {}
virtual void foo() {
printf("function foo\n");
}
};
class C : public A {
public:
C() {}
virtual ~C() {}
virtual void bar() {
printf("function bar\n");
}
};
class D : public B {
public:
D() {}
virtual ~D() {}
virtual void foo() {
printf("function foo from D\n");
}
};
A* A::head = 0;
int main() {
A a_cls;
B b_cls;
C c_cls;
D d_cls;
A* step = A::head;
B* step_b = 0;
while (step != 0) {
step_b = dynamic_cast<B *>(step);
if (step_b != 0) {
step_b->foo();
}
step = step->next;
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CmNsYXNzIEEgewogcHVibGljOgogICAgQSgpIDogbmV4dCgwKSB7CiAgICAgICAgaWYgKGhlYWQgPT0gMCkgewogICAgICAgICAgICBoZWFkID0gdGhpczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBBKiBzdGVwID0gaGVhZDsKICAgICAgICAgICAgd2hpbGUgKHN0ZXAtPm5leHQgIT0gMCkgewogICAgICAgICAgICAgICAgc3RlcCA9IHN0ZXAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RlcC0+bmV4dCA9IHRoaXM7CiAgICAgICAgfQogICAgfQogICAgdmlydHVhbCB+QSgpIHsKICAgICAgICBpZiAoaGVhZCA9PSB0aGlzKSB7CiAgICAgICAgICAgIGhlYWQgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEEqIHN0ZXAgPSBoZWFkOwogICAgICAgICAgICB3aGlsZSAoc3RlcC0+bmV4dCAhPSB0aGlzKSB7CiAgICAgICAgICAgICAgICBzdGVwID0gc3RlcC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGVwLT5uZXh0ID0gbmV4dDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHN0YXRpYyBBKiBoZWFkOwogICAgQSogbmV4dDsKfTsKCmNsYXNzIEIgOiBwdWJsaWMgQSB7CiBwdWJsaWM6CiAgICBCKCkge30KICAgIHZpcnR1YWwgfkIoKSB7fQogICAgdmlydHVhbCB2b2lkIGZvbygpIHsKICAgICAgICBwcmludGYoImZ1bmN0aW9uIGZvb1xuIik7CiAgICB9Cn07CgpjbGFzcyBDIDogcHVibGljIEEgewogcHVibGljOgogICAgQygpIHt9CiAgICB2aXJ0dWFsIH5DKCkge30KICAgIHZpcnR1YWwgdm9pZCBiYXIoKSB7CiAgICAgICAgcHJpbnRmKCJmdW5jdGlvbiBiYXJcbiIpOwogICAgfQp9OwoKY2xhc3MgRCA6IHB1YmxpYyBCIHsKIHB1YmxpYzoKICAgIEQoKSB7fQogICAgdmlydHVhbCB+RCgpIHt9CiAgICB2aXJ0dWFsIHZvaWQgZm9vKCkgewogICAgICAgIHByaW50ZigiZnVuY3Rpb24gZm9vIGZyb20gRFxuIik7CiAgICB9Cn07CgpBKiBBOjpoZWFkID0gMDsKCmludCBtYWluKCkgewogICAgQSBhX2NsczsKICAgIEIgYl9jbHM7CiAgICBDIGNfY2xzOwogICAgRCBkX2NsczsKCiAgICBBKiBzdGVwID0gQTo6aGVhZDsKICAgIEIqIHN0ZXBfYiA9IDA7CgogICAgd2hpbGUgKHN0ZXAgIT0gMCkgewogICAgICAgIHN0ZXBfYiA9IGR5bmFtaWNfY2FzdDxCICo+KHN0ZXApOwogICAgICAgIGlmIChzdGVwX2IgIT0gMCkgewogICAgICAgICAgICBzdGVwX2ItPmZvbygpOwogICAgICAgIH0KICAgICAgICBzdGVwID0gc3RlcC0+bmV4dDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=