#include <iostream>
#include <functional>
#include <memory>
struct A {
virtual void operator()() {
std::cout << "classA" << std::endl;
}
virtual ~A() {}
};
struct B : public A {
void operator()() {
std::cout << "classB" << std::endl;
}
};
struct C : public B {
void operator()() final {
std::cout << "classC" << std::endl;
}
};
int main()
{
std::function<void(void)>func[] = {
A(),
B(),
C(),
};
for (auto a : func)
a();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPG1lbW9yeT4KCnN0cnVjdCBBIHsKICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IoKSgpIHsKICAgIHN0ZDo6Y291dCA8PCAiY2xhc3NBIiA8PCBzdGQ6OmVuZGw7CiAgfQogIHZpcnR1YWwgfkEoKSB7fQp9OwoKc3RydWN0IEIgOiBwdWJsaWMgQSB7CiAgdm9pZCBvcGVyYXRvcigpKCkgewogICAgc3RkOjpjb3V0IDw8ICJjbGFzc0IiIDw8IHN0ZDo6ZW5kbDsKICB9Cn07CgpzdHJ1Y3QgQyA6IHB1YmxpYyBCIHsKICB2b2lkIG9wZXJhdG9yKCkoKSBmaW5hbCB7CiAgICBzdGQ6OmNvdXQgPDwgImNsYXNzQyIgPDwgc3RkOjplbmRsOwogIH0KfTsKCmludCBtYWluKCkKewogIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT5mdW5jW10gPSB7CiAgICBBKCksCiAgICBCKCksCiAgICBDKCksCiAgfTsKCiAgZm9yIChhdXRvIGEgOiBmdW5jKQogICAgYSgpOwp9