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



我想用 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"或"重写"是必需的,因为此声明与函数 A:solve 匹配

如果我使用虚拟double solve(OtherWrapper ^) override;而不是使用virtual double solve(OtherWrapper ^) =0;,并且我在.cpp文件中实现了成员函数,那么它可以工作。我希望B_Wrapper是抽象的,这样我就不必实现B_Wrapper::solve(..)。我错过了什么?

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

只需从您的B_Wrapper声明中删除solve即可。

因为您是从 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();
};

C++/CLI 编译器试图阻止你把脚踢掉。 B_Wrapper类有两个名为 solve(( 的方法。 从A_Wrapper继承的那个和您添加的那个。 添加的隐藏继承的。

此方案是C++中非常常见的错误,在通过添加参数修改虚拟方法时引起。 如果未编辑基方法,则此类方法将不再覆盖该方法。 诊断起来非常棘手。 C++/CLI 语言对此做点什么还为时过早。 后来被采用到 C++11 中,并添加了 override 修饰符。 如果要重写基方法并在打算隐藏时显式使用new,则必须使用 override

这里两者都不是故意的,因为您实际上并没有覆盖抽象方法,并且没有可以想象的理由为什么要隐藏继承的方法。 只需删除 B_Wrapper 中的 solve(( 方法声明,您已经继承了A_Wrapper的声明。

我通过以下方式

使用"override"关键字解决了这个问题。

基类

ref class DataBackUp
{
    public:
       virtual void StartBackUp(void) = 0;
};

派生类

ref class FlatBackup : public DataBackUp 
{
    public:
        void StartBackUp(void) override
        {
        }
};

相关内容

最新更新