#include <iostream>
#include <vector>
#include <functional>
class Base {
std::string data;
protected:
std::vector< std::function<void()> > steps;
public:
Base() : data("qq")
, steps{
[](){ std::cout << "BaseMethod1()" << std::endl; }
, [](){ std::cout << "BaseMethod2()" << std::endl; }
, [](){ std::cout << "BaseMethod3()" << std::endl; }
, [this](){ std::cout << "data: " << data << std::endl; }
}
{ }
};
struct A final : Base {
A() {
steps.insert(
steps.begin() + 2,
[](){ std::cout << "A_Specific_Operations()" << std::endl; }
);
}
void doSomething() {
for( auto&& step : steps ) step();
}
};
struct B final : Base {
B() {
steps.insert(
steps.begin() + 1,
[](){ std::cout << "B_Specific_Operations()" << std::endl; }
);
}
void doSomething() {
for( auto&& step : steps ) step();
}
};
int main() {
using namespace std;
A().doSomething();
cout << endl;
B().doSomething();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIEJhc2UgewogICAgc3RkOjpzdHJpbmcgZGF0YTsKcHJvdGVjdGVkOiAgICAKICAgIHN0ZDo6dmVjdG9yPCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gPiBzdGVwczsKcHVibGljOgogICAgQmFzZSgpIDogZGF0YSgicXEiKQogICAgLCBzdGVwc3sKICAgICAgICBbXSgpeyBzdGQ6OmNvdXQgPDwgIkJhc2VNZXRob2QxKCkiIDw8IHN0ZDo6ZW5kbDsgfQogICAgICAgICwgW10oKXsgc3RkOjpjb3V0IDw8ICJCYXNlTWV0aG9kMigpIiA8PCBzdGQ6OmVuZGw7IH0KICAgICAgICAsIFtdKCl7IHN0ZDo6Y291dCA8PCAiQmFzZU1ldGhvZDMoKSIgPDwgc3RkOjplbmRsOyB9CiAgICAgICAgLCBbdGhpc10oKXsgc3RkOjpjb3V0IDw8ICJkYXRhOiAiIDw8IGRhdGEgPDwgc3RkOjplbmRsOyB9CiAgICB9CiAgICB7IH0KfTsKCnN0cnVjdCBBIGZpbmFsIDogQmFzZSB7CiAgICBBKCkgewogICAgICAgIHN0ZXBzLmluc2VydCgKICAgICAgICAgICAgc3RlcHMuYmVnaW4oKSArIDIsCiAgICAgICAgICAgIFtdKCl7IHN0ZDo6Y291dCA8PCAiQV9TcGVjaWZpY19PcGVyYXRpb25zKCkiIDw8IHN0ZDo6ZW5kbDsgfQogICAgICAgICk7CiAgICB9CiAgICAKICAgIHZvaWQgZG9Tb21ldGhpbmcoKSB7CiAgICAgICAgZm9yKCBhdXRvJiYgc3RlcCA6IHN0ZXBzICkgc3RlcCgpOwogICAgfQp9OwoKc3RydWN0IEIgZmluYWwgOiBCYXNlIHsKICAgIEIoKSB7CiAgICAgICAgc3RlcHMuaW5zZXJ0KAogICAgICAgICAgICBzdGVwcy5iZWdpbigpICsgMSwKICAgICAgICAgICAgW10oKXsgc3RkOjpjb3V0IDw8ICJCX1NwZWNpZmljX09wZXJhdGlvbnMoKSIgPDwgc3RkOjplbmRsOyB9CiAgICAgICAgKTsKICAgIH0KICAgIAogICAgdm9pZCBkb1NvbWV0aGluZygpIHsKICAgICAgICBmb3IoIGF1dG8mJiBzdGVwIDogc3RlcHMgKSBzdGVwKCk7CiAgICB9Cn07CgoKaW50IG1haW4oKSB7CiAgICAKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAKICAgIEEoKS5kb1NvbWV0aGluZygpOwogICAgY291dCA8PCBlbmRsOwogICAgQigpLmRvU29tZXRoaW5nKCk7CiAgICAKfQ==