我正在尝试将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#中运行得非常好......
除非COperations继承IDocInterface,否则其AddOperations()成员函数不会以任何方式与具有相同签名的虚函数相关联IDocInterface.在这种情况下,C++编译器会抱怨缺少实现.
然而,在继承IDocInterface中COperations会产生继承相同的成员函数的多条路径.这可能是一个问题,因为通过不同路径继承的函数,甚至是纯虚函数,都被认为是不同的(这与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)
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |