我想用c ++ / cli编写一个包装器,用c#图形接口传递c ++库。
当我想在c ++ / cli中实现继承时,我的问题出现了: 想法: 抽象类B继承自抽象类A. C类继承自抽象类B
public ref class A_Wrapper abstract
{
public:
A_Wrapper(void);
virtual double solve(OtherWrapper ^) =0;
};
public ref class B_Wrapper abstract: public A_Wrapper
{
private:
B * nativeLS;
public:
B_Wrapper(void);
virtual double solve(OtherWrapper ^) =0;
virtual B * getNative();
};
我发现的错误是: 错误:需要'new'或'override',因为此声明与函数A:solve
匹配如果我使用虚拟double solve(OtherWrapper ^) override;
而不是使用virtual double solve(OtherWrapper ^) =0;
并且我在.cpp文件中实现成员函数,那么它可以工作。我希望B_Wrapper是抽象的,这样我就不必实现B_Wrapper::solve(..)
。我错过了什么?
希望我很清楚,有人可以帮助我。 提前谢谢。
答案 0 :(得分:2)
只需从solve
声明中删除B_Wrapper
即可。
由于您继承自A_Wrapper
,因此已声明solve
方法。您不需要再次声明它只是为了重新迭代该方法没有实现的事实。
public ref class A_Wrapper abstract
{
public:
A_Wrapper(void);
virtual double solve(OtherWrapper ^) =0;
};
public ref class B_Wrapper abstract: public A_Wrapper
{
private:
B* nativeLS;
public:
B_Wrapper(void);
virtual B * getNative();
};
答案 1 :(得分:1)
C ++ / CLI编译器试图阻止你开始射击。 B_Wrapper类有两个名为solve()的方法。从A_Wrapper继承的那个和你添加的那个。添加的隐藏继承的
。这种情况是C ++中一个非常常见的错误,是在通过添加参数修改虚拟方法时引发的。如果没有编辑那个方法,这种方法不再覆盖基本方法。诊断相当棘手。 C ++ / CLI语言很早就做了些什么。后来通过添加覆盖修饰符进入C ++ 11。如果要覆盖基本方法并在隐藏时明确使用 new ,则必须使用覆盖。
由于你实际上并没有覆盖抽象方法,因此非常高的赔率,因为你实际上并没有想要隐藏继承的方法。只需删除B_Wrapper中的solve()方法声明,您已经从A_Wrapper继承了该声明。
答案 2 :(得分:0)
我通过以下方式解决了'override'关键字。
ref class DataBackUp
{
public:
virtual void StartBackUp(void) = 0;
};
ref class FlatBackup : public DataBackUp
{
public:
void StartBackUp(void) override
{
}
};