c ++ / cli sintaxis:错误:需要'new'或'override',因为此声明与函数匹配

时间:2013-09-25 06:52:42

标签: inheritance c++-cli abstract-class

我想用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(..)。我错过了什么?

希望我很清楚,有人可以帮助我。 提前谢谢。

3 个答案:

答案 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
        {
        }

};