@borzykot

C++: как унаследоваться одновременно от базового класса и «интерфейса» при этом если оба они имеют общий «интерфейс»?

Глоссарий: интерфейсом будем считать класс с чисто виртуальными функциями без состояния.

Допустим есть некий базовый интерфейс. От него наследуются другие интерфейсы. От них - рабочие классы. Примерно так:
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++? Если это возможно разумеется. В интерфейсы помещать некие дефолтные реализации не хочется.
  • Вопрос задан
  • 302 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Комментировать
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
гугли виртуальное наследование.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы