Глоссарий: интерфейсом будем считать класс с чисто виртуальными функциями без состояния.
Допустим есть некий базовый интерфейс. От него наследуются другие интерфейсы. От них - рабочие классы. Примерно так:
struct block_i
{
virtual ~block_i() = default;
virtual bool is_done() const = 0;
//...
};
template<class T>
struct consumer_block_i : public block_i
{
virtual void register_producer(producer_block_i<T>&) = 0;
//...
};
template<class T>
struct action_block : public consumer_block_i<T>
{
virtual bool is_done() const override { return false; }
virtual void register_producer(producer_block_i<T>&) override {}
//...
};
Таких классов как action_block несколько, и все они содержат в том числе некий одинаковый код. Хотелось бы поместить его в базовый класс, допустим block_base, унаследовать его от block_i. чтобы получилось примерно так:
struct block_base : public block_i
{
virtual bool is_done() const override { return false; }
};
template<class T>
class action_block
: public virtual block_base
, public virtual consumer_block_i<T>
{
virtual void register_producer(producer_block_i<T>&) override {}
//...
};
Но сделать так в C++ я не могу (ну или не знаю как) - получаю ошибку компиляции. В C# так сделать можно:
interface IBlock
{
bool IsDone();
}
interface IConsumer : IBlock
{
void RegisterProducer(IProducer producer);
}
class BlockBase : IBlock
{
public bool IsDone() { return false; }
}
class Consumer : BlockBase, IConsumer
{
private IProducer producer_;
public void RegisterProducer(IProducer producer) { producer_ = producer; }
}
Вопрос: как реализовать такое же на C++? Если это возможно разумеется. В интерфейсы помещать некие дефолтные реализации не хочется.