#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();
}