#pragma once

#include <iostream>

class IFoo
{
public:
    virtual ~IFoo() = default;
    virtual int bar() const = 0;
};

class AFoo : public IFoo
{
public:
    int bar() const override
    {
        std::cout << "AFoo::bar()" << std::endl;
        return 42;
    }
};

class BFoo : public IFoo
{
public:
    BFoo(int i) : _i(i) {}
    int bar() const override
    {
        std::cout << "BFoo::bar()" << std::endl;
        return _i;
    }

private:
    int _i;
};
