- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试将 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/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!