#include <iostream>
struct Base
{
void f() const
{
pre_f();
std::cout << "f() stuff\n";
post_f();
}
virtual ~Base() {}
private:
virtual void pre_f() const = 0;
virtual void post_f() const = 0;
};
struct Derived : Base
{
private:
virtual void pre_f() const override
{
std::cout << "pre f() stuff\n";
}
virtual void post_f() const override
{
std::cout << "post f() stuff\n";
}
};
int main()
{
Derived d;
d.f();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEJhc2UKewogICAgdm9pZCBmKCkgY29uc3QKICAgIHsKICAgICAgICBwcmVfZigpOwogICAgICAgIHN0ZDo6Y291dCA8PCAiZigpIHN0dWZmXG4iOwogICAgICAgIHBvc3RfZigpOwogICAgfQogICAgCiAgICB2aXJ0dWFsIH5CYXNlKCkge30KICAgIApwcml2YXRlOgogICAgdmlydHVhbCB2b2lkIHByZV9mKCkgY29uc3QgPSAwOwogICAgdmlydHVhbCB2b2lkIHBvc3RfZigpIGNvbnN0ID0gMDsKfTsKCnN0cnVjdCBEZXJpdmVkIDogQmFzZQp7CnByaXZhdGU6CiAgICB2aXJ0dWFsIHZvaWQgcHJlX2YoKSBjb25zdCBvdmVycmlkZQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAicHJlIGYoKSBzdHVmZlxuIjsKICAgIH0KICAgIAogICAgdmlydHVhbCB2b2lkIHBvc3RfZigpIGNvbnN0IG92ZXJyaWRlCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJwb3N0IGYoKSBzdHVmZlxuIjsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgRGVyaXZlZCBkOwogICAgZC5mKCk7Cn0=