C ++:从基类和具有公共基接口

时间:2017-07-23 18:51:18

标签: c# c++ oop interface base-class

这是我的类层次结构(简要说明):

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 void register_producer(producer_block_i<T>&) override {}
  //...
};

它有效(我相信)。

block_iconsumer_block_i - 是纯虚拟接口。我想保持主题纯虚拟。有多个用户端块(例如action_blocktransform_block)并且它们共享大量代码,我想将这些公共代码放入基类(例如block_base)。

这就是我想要的C#:

interface IBlock
{
    bool IsDone();
}

interface IProducer : IBlock
{
    void RegisterConsumer(IConsumer producer);
}

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 ++中,我不能完全像在C#中那样。如果我尝试继承block_baseconsumer_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 {}
  //...
};
  

错误C2259&#39; cppdf :: action_block&#39;:无法实例化   抽象类

我如何实现这一点(我的意思是同时使用纯虚拟接口和基类)?也许我需要检查一下我的架构? 感谢。

1 个答案:

答案 0 :(得分:0)

block_i被继承两次。

  1. action_block:public block_base,这里实现了is_done。
  2. action_block:public consumer_block_i,而is_done不是 实现!并且无法访问其他基类的实现。