#include <iostream>
using namespace std;

struct Base
{
    void foo() const {
        cout << "Base::foo()\n";
    }
    
    virtual void virt() const {
        cout << "Base::virt() called\n";
    }
};

struct Derived : private Base
{
    const Base* get() const {
        return this;
    }
    
private:
    virtual void virt() const override {
        cout << "Derived::virt() called\n";
    }
};

int main()
{
    Derived d;
    //const Base *b = &d; //uncomment to get error
    const Base *b = d.get();
    b->foo();
    b->virt();
}