在不同类中实现的纯虚函数的继承

Jör*_*gen 2 c++ inheritance

我正在尝试将ac#项目转换为c ++.我正在尝试以下方法:

class IDocInterface
{
 public:
      // implemented in CSpecificDoc
      virtual bool CreateDoc() = 0;

      // implemented in COperations
      virtual void AddOperation() = 0;

      // implemented in CDoc
      virtual void Save() = 0;
};

class COperations
{
 public:
      void AddOperation() {}; // implementation for CDoc and derivates
};

class CDoc : public IDocInterface, public COperations
{
    public:
         void Save() {}; // implemented here
};

class CSpecificDoc : public CDoc
{
public:
      bool CreateDoc() {}; // implemented here
};
Run Code Online (Sandbox Code Playgroud)

当我尝试做的时候:

  IDoc * pDoc = new CSpecificDoc(); 
Run Code Online (Sandbox Code Playgroud)

我得到错误c2259由于以下成员而无法实例化抽象类:void IDocInterface :: AddOperations()是抽象的.

不知道我错过了什么.

我的继承结构在c#中工作正常,我使用"interface IDocInterface"和"abstract class CDoc".

解:

添加:

class IOperations
{
 public:
     virtual void AddOperation() = 0;
}
Run Code Online (Sandbox Code Playgroud)

然后将上面改为:

 class IDocInterface : public virtual IOperations
 {  
 public:
      // implemented in CSpecificDoc
      virtual bool CreateDoc() = 0;

      // implemented in CDoc
      virtual void Save() = 0;
 };
Run Code Online (Sandbox Code Playgroud)

 class COperations : public virtual IOperations
Run Code Online (Sandbox Code Playgroud)

尽管如此,我觉得有点奇怪的是,在没有IOperations类的情况下,整个事情在C#中运行得非常好......

das*_*ght 5

除非COperations继承IDocInterface,否则其AddOperations()成员函数不会以任何方式与具有相同签名的虚函数相关联IDocInterface.在这种情况下,C++编译器会抱怨缺少实现.

然而,在继承IDocInterfaceCOperations会产生继承相同的成员函数的多条路径.这可能是一个问题,因为通过不同路径继承的函数,甚至是纯虚函数,都被认为是不同的(这与Java和C#的接口实现形成鲜明对比).您可以通过标记继承来解决此问题virtual,如下所示:

class IWithOperations {
public:
      // implemented in COperations
      virtual void AddOperation() = 0;
};

class IDocInterface : public virtual IWithOperations
{
 public:
      // implemented in CSpecificDoc
      virtual bool CreateDoc() = 0;

      // implemented in CDoc
      virtual void Save() = 0;
};

class COperations : public virtual IWithOperations
{
 public:
      void AddOperation() {}; // implementation for CDoc and derivates
};

class CDoc : public virtual IDocInterface, public virtual COperations
{
    public:
         void Save() {} // implemented here
         virtual bool CreateDoc() = 0; // must be overridden
};

class CSpecificDoc : public virtual CDoc
{
public:
      bool CreateDoc() {} // implemented here
};
Run Code Online (Sandbox Code Playgroud)

这是关于ideone演示.