gpt4 book ai didi

c++ - 不同类中实现的纯虚函数的继承

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:02 24 4
gpt4 key购买 nike

我正在尝试将 C# 项目转换为 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
};

当我尝试做的时候:

  IDoc * pDoc = new CSpecificDoc(); 

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

不知道我错过了什么。

我的继承结构在 c# 中工作得很好,我使用“接口(interface) IDocInterface”和“抽象类 CDoc”。

解决方案:

添加:

class IOperations
{
public:
virtual void AddOperation() = 0;
}

然后把上面的改成:

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

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

 class COperations : public virtual IOperations

不过,我认为在没有 IOperations 类的情况下,整个事情在 C# 中运行得如此好,这有点奇怪......

最佳答案

除非 COperations 继承 IDocInterface,否则它的 AddOperations() 成员函数不被认为与具有相同签名的虚函数有任何关联在 IDocInterface 中定义。在这种情况下,C++ 编译器会提示缺少实现。

但是,在COperations 中继承IDocInterface 会创建多个继承相同成员函数的路径。这可能是一个问题,因为通过不同路径继承的函数,即使是纯虚函数,也被认为是不同的(这与Java和C#的接口(interface)实现形成鲜明对比)。您可以通过将继承标记为 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
};

这是一个demo on ideone .

关于c++ - 不同类中实现的纯虚函数的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17021284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com