#include <iostream>

struct A { virtual void f() { std::cout << __PRETTY_FUNCTION__ << '\n'; } };
struct B : protected A { void f() override { std::cout << __PRETTY_FUNCTION__ << '\n'; } };

int main()
{
    B b;
    A* p = &b;
    
    b.f();
    p->f();
    p->A::f();
}