Можно сделать например так:
#include <iostream>
#include <iomanip>
#include <memory>
class ISomeInterface
{
public:
virtual bool isFoo() const noexcept = 0;
};
class Foo : public ISomeInterface
{
public:
bool isFoo() const noexcept override { return true; }
};
class Bar : public ISomeInterface
{
public:
bool isFoo() const noexcept override { return false; }
};
int main()
{
// Or shared_ptr/make_shared
std::unique_ptr<ISomeInterface> foo = std::make_unique<Foo>();
std::cout << "Foo is Foo: " << std::boolalpha << foo->isFoo() << std::endl;
// Or shared_ptr/make_shared
std::unique_ptr<ISomeInterface> bar = std::make_unique<Bar>();
std::cout << "Bar is Foo: " << std::boolalpha << bar->isFoo() << std::endl;
return 0;
}
Ну и в методах не обязательно возвращать просто true/false, там может быть любая другая переменная.